@DVoropaev
Ставлю + к карме на хабре за ответы на вопросы

Почему не получается скомпилировать GNU assembler?

цель - посмотреть процесс превращения кода на си в исполняемый файл
#include <stdio.h>

int main(){
   printf("Hello");
   return 0;
}
Обычная компиляция:
$gcc ./main.c -o main.o
$ ./main.o 
Hello

.c -> assembler -.> executable file
$gcc -S ./main.c -o ./main.s     #превращаем в ассемблерный код
$ as ./main.s -o ./main.o  #ассемблируем
$ ld ./main.o #пытаемся линковать, но выскакивает ошибка
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
./main.o: In function `main':
main.c:(.text+0xf): undefined reference to `printf'

#А если пытаемся линковать средствами gcc, то все работает
$ gcc ./main.o
$ ./a.out 
Hello

Код на ассмблере на всякий случай
.file	"main.c"
	.section	.rodata
.LC0:
	.string	"Hello"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609"
	.section	.note.GNU-stack,"",@progbits

  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега GCC
Седой и строгий
Потому что когда gcc запускает ld, он передаёт ему существенно больше параметров, включая необходимые библиотеки, а не только объектный модуль программы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы