Пытаюсь понять процесс статической линковки, загрузки GCC:
У меня есть следующая игрушечная программа
#include "stdio.h"
int main() {
fprintf(stdout, "Hello World \n");
return 0 ;
}
Я могу скомпилировать его и запустить файл следующим образом:
gcc -static -std=gnu99 -Wall -Wno-unused -g test.c -o test;
Но как только я пытаюсь разделить процесс компиляции и компоновки следующим образом:
gcc -static -std=gnu99 -Wall -Wno-unused -g test.c -c;
ld -o test -T link.lds test.o
где ссылка.lds
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
Я получаю сообщение об ошибке "неопределенная ссылка на stdouttest.o: в функции `main':
test.c:(.text+0x7): undefined reference to `stdout'
test.c:(.text+0x1e): undefined reference to `fwrite'
Если я попытаюсь добавить флаг -lc к ld, он скажет мне, что он не найден. Я пытался запустить gcc с параметрами -lc и/или -static-libgcc, но у меня та же проблема.
Что я делаю не так?
gcc -static -std=gnu99 -Wall -Wno-unused -g test.c -c && gcc test.o -o test
с gcc-4.4.7 - person Peixu Zhu   schedule 22.10.2014-lc
, добавив другие посохи, такие как crt1.o, crtn.o, crtbegin.o, crtend.o и т. д., которые сопровождают ваш gcc. вы можете запуститьgcc -v test.o
, чтобы проверить, какgcc
выполняет эту работу. - person Peixu Zhu   schedule 22.10.2014test
в качестве имени исполняемого файла, так как это встроенная оболочка. Добавьте-v
к своимgcc
командам, чтобы понять, что происходит, например. скомпилировать сgcc -v -static -std=gnu99 -Wall -Wno-unused -g test.c -o mytest
- person Basile Starynkevitch   schedule 22.10.2014crtbeginT.o
иcrtend.o
? В данном случае они не нужны. Однакоcrt1.o
,crti.o
иcrtn.o
необходимы. Где описано, что из себя представляет каждый из них? - person Z boson   schedule 22.10.2014ld
сообщит об ошибке требования. - person Peixu Zhu   schedule 23.10.2014