2013-01-19 11 views
9

consideri il programma ciao mondo C:Come determinare quali opzioni della riga di comando gcc passa a ld per impostazione predefinita?

hello.c:

#include "stdio.h" 

int main() 
{ 
     printf("Hello, World!\n"); 
} 

Se chiamo:

$ gcc -c hello.c -o hello.o 

Si produrrà un file ELF rilocabile hello.o

Se poi chiamo:

$ gcc hello.o -o hello   [1] 

Si collegherà con hello.o ld e produrre un file eseguibile ELF ciao

Tuttavia, se io chiamo ld direttamente [2] invece di [1]:

$ ld hello.o -o hello    [2] 

ottengo questi errori:

/usr/bin/ld.bfd.real: warning: cannot find entry symbol _start 
test.c:(.text+0xa): undefined reference to `puts' 

gcc mosto passare altre opzioni a ld (per collegare la libreria C ad esempio).

Esiste comunque un modo per determinare esattamente quale riga di comando gcc sta passando per ld nel comando [1]?

risposta

15

Sì, è possibile utilizzare gcc -v hello.o -o hello per ottenere la linea di collegamento. Per il vostro esempio, sulla mia macchina Ubuntu, ho questa linea di collegamento (a cura da MultiLine per migliorare la leggibilità):

/usr/lib/gcc/x86_64-linux-gnu/4.4.5/collect2 
--build-id 
--eh-frame-hdr 
-m elf_x86_64 
--hash-style=gnu 
-dynamic-linker 
/lib64/ld-linux-x86-64.so.2 
-o hello 
-z relro 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib 
-L/lib/../lib 
-L/usr/lib/../lib 
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../.. -L/usr/lib/x86_64-linux-gnu 
hello.o 
-lgcc 
--as-needed -lgcc_s --no-as-needed 
-lc 
-lgcc 
--as-needed -lgcc_s --no-as-needed 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o 

noti che collect2 è solo un alias per ld.

+1

Sembra che sul mio contenitore Ubuntu 12.10 64 'collect2' non sia un semplice alias per' ld'. 'collect2' è un eseguibile- mentre' ld' è un collegamento simbolico a 'ld.bfd' che è un link simbolico a' hardened-ld', che è uno script perl. Non ho idea di cosa sta succedendo lì. –

+1

Mi spiace, non intendo alias letterale. Troverete che se si esegue lo stesso comando con 'ld' invece funzionerà lo stesso, però. Documenti: http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gccint/Collect2.html –

+0

Qual è la differenza tra 'collect2' e' ld'? Non ho potuto capire facilmente dopo aver letto il gccint. –

Problemi correlati