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]
?
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ì. –
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 –
Qual è la differenza tra 'collect2' e' ld'? Non ho potuto capire facilmente dopo aver letto il gccint. –