Связывание динамически связанного исполняемого файла с помощью ld - PullRequest
3 голосов
/ 28 апреля 2011

Я пытаюсь создать динамически связанный исполняемый файл (elf_i386) без gcc.Программа очень проста (только printf) ... вот команды:

$ gcc -c simple.c
$ ld -o simple -dynamic-linker /lib/ld-linux.so.2 --entry main /usr/lib/crt1.o /usr/lib/crti.o simple.o -lc /usr/lib/crtn.o

Исполняемый файл создан, а также команда file и команда ldd показывают правильный вывод ... Однако, когда я запускаю программупосле вызова printf я получаю ошибку сегментации ... я проверил с помощью objdump исполняемый файл и думаю, что проблема связана с dtors ... кажется, что компилируется с:

$gcc -o simple simple.c

секцией.dtors присутствует, пока его нет внутри исполняемого файла, созданного непосредственно с помощью ld: (

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 12 июля 2011

потерять --entry main.main не ваша точка входа, _start есть.Попробуйте это:

$ gcc -c hello.c
$ ld -o hello -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o hello.o -lc /usr/lib/crtn.o
$ ./hello
hello, world
$ 
2 голосов
/ 24 сентября 2016

Нет необходимости включать C среду выполнения, я полагаю, если вы не используете return из вашего main().

. Мы можем удалить CRT и просто связать, используя:

ld -o hello -lc -dynamic-linker /lib/ld-linux.so.2 hello.o -e main

Будет работать.

...