[c] GNU's C Compiler en Linker

Pagina: 1
Acties:

  • J.Hollemans
  • Registratie: September 2001
  • Laatst online: 03-10-2025
Ik heb een klein programmaatje:
code:
1
2
3
4
5
6
7
#include <stdio.h>

int main()
{
 printf("Hello world !");
 return 0;
}

als ik deze met gcc compileer, zonder te linken
code:
1
gcc -c hello.c

krijg ik de object file hello.o

wanneer ik deze handmatig probeel te linken met ld
code:
1
ld -lc hello.o

krijg ik de foutmelding:
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048190

wat betekent dit en hoe los ik dit op ?

Far from being some stuffy science, writing regular expressions is closer to an art.


Verwijderd

/me doet:
code:
1
gcc -o progje -O2 file1.c file2.c file3.c

of:
code:
1
2
3
4
5
gcc -c -O2 file1.c
gcc -c -O2 file2.c
gcc -c -O2 file3.c

gcc -o progje file1.o file2.o file3.o

met -O2 voor lvl2 optimalisaties

ld moet die file nog ergens mee linken... en dat is je runtime lib (_ctnogwat.o ergens in een ver weg geborgen directory). Die moet je ook nog opgeven. Maar daarom kan je beter gcc nemen, die doet dat meteen voor je.

Verwijderd

Ik doe altijd:

gcc -o test test.c

dan krijg je daar in een keer de executable test uit.

Verwijderd

't is handiger inderdaad als je gcc laat linken maar als je het dan toch met de hand doet niet vergeten de crt lib mee te linken natuurlijk.
code:
1
ld -lc hello.o /usr/lib/crt1.o /usr/lib/crti.o

edit:

Hmmz dan linkt ie alleen runnen doet het niet :Y)
naja zoek het zelf maar uit, zie gcc -v hello.c om uit te vinden hoe ie de linker aan roept

Verwijderd

Op zaterdag 06 oktober 2001 15:48 schreef lnfinitive het volgende:
met -O2 voor lvl2 optimalisaties
<lekker offtopic>
Mijn standaard optimalisatie settings zijn -O9 -fomit-frame-pointer. Dat maakt echt wel wat verschil met -O2, en ik heb nog nooit problemen met de gegenereerde code gehad (ik gebruik wel altijd de warning parameters -Wall -Werror en ook nog -ansi -pedantic als het c ipv. c++ is.)
</lekker offtopic>

<edit>
Overigens kun je met de opties -fverbose-asm -S in de gegenereerde .s assembly file precies zien welke -f opties er door een bepaald -O optimalisatielevel geactiveerd worden.
</edit>