x86_64 "gcc -S" -> as -> ld -> выполнение не выполнено - PullRequest
2 голосов
/ 23 августа 2011

Я пытаюсь скомпилировать упрощенный исходный файл C с помощью "gcc -S" -> "as" -> "ld" на платформе x86_64.

Процесс завершился без ошибок, но при выполнении,Появляется сообщение об ошибке «Нет такого файла или директории».

ctest.c
int main()
{
    return 0;
}

> gcc -S ctest.c
> as -o ctest.o ctest.s
> ld -o ctest  /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o
> ./ctest 
bash: ./ctest: No such file or directory

> uname -a
Linux mkb3 2.6.27.48-0.3-default #1 SMP 2010-09-20 11:03:26 -0400 x86_64 x86_64 x86_64 GNU/Linux

Я также пытался добавить динамическую ссылку, как указано в некоторых результатах Google.

> ld -o ctest -dynamic-linker /lib64/ld-linux.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o

Но ошибка осталась.

Комментарии и предложения приветствуются.

Редактировать: Я сделал ошибку, /lib64/ld-linux.so.2 не существует в моем linux-окне.Я должен был использовать /lib64/ld-2.9.so.Не знал, что ld не сообщает об ошибке с указанием несуществующего библиотечного файла.

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Вы должны связать, используя -dynamic-linker /lib/ld-linux-x86-64.so.2 вместо /lib64/ld-linux.so.2, что для 32-битного.

/lib64 $ file -L ld*
ld-linux.so.2:        ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
ld-linux-x86-64.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

В целом, это работает для меня:

$ gcc -S ctest.c
$ as -o ctest.o ctest.s
$ ld -o ctest -dynamic-linker /lib/ld-linux-x86-64.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o

Если это не помогает, следуйте предложению @nm и проверьте вывод gcc -v -o ctest ctest.c.

1 голос
/ 23 августа 2011

-dynamic-linker у меня работает, но у меня 32-битная система.

Запустите gcc -v -o ctest ctest.o и посмотрите на последнюю строку вывода. Попробуйте запустить его как команду. Если это работает, начните упрощать его, выбрасывая части, пока он больше не работает. Затем выбросить еще несколько деталей и т. Д. Вот так я и пришел к команде, которая работает.

Вы также можете просто использовать gcc -o ctest ctest.o.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...