Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Linker Warning: cannot find entry symbol _start

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.07.2009, 00:44 Uhr
Dirk1980



Hallo,

ich habe folgendes Miniprogramm

Code:
#include <stdio.h>

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



Zuerst kompiliere ich die Datei "hello_world.c", die obenstehenden Code enthält:


Code:
gcc -c hello_world.c



Danach möchte ich die kompilierte Datei "hello_world.o" und die Standard C-Library (shared library), welche die Implementierung von "printf" enthält in das Executable "hello_world" zusammenlinken:


Code:
ld -o hello_world hello_world.o -lc



Doch nun erhalte ich die Warnung:

Code:
ld: warning: cannot find entry symbol _start; defaulting to 00000000080481a4



Warum klappt es nicht? Ich habe bei Google zwar schon einige Themen hierzu gefunden. Aber es noch nirgendwo richtig verstanden.

Ich verwende Linux (Ubuntu). Wie muss ich den Linker-Befehl ausführen um mein Executable zu erhalten?

Wenn ich dagegen alles in einem Rutsch mache und den Linker nicht explizit aufrufe, dann klappt es:

Code:
gcc -o hello_world hello_world.c



Warum klappt es jetzt?

Vielen Dank schon einmal im Voraus und viele Grüße
Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.07.2009, 01:30 Uhr
0xdeadbeef
Gott
(Operator)


Weil in deinem ld-Aufruf ein paar Module fehlen, die gcc automatisch dazulinkt. Mit gcc -v -o hello_word hello_world.o kannst du sehen, wie genau der Linker aufgerufen wird (über das collect2-Hilfsprogramm).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.07.2009, 20:48 Uhr
Dirk1980



Hallo,

vielen Dank für Deinen Tipp.

Das hier kommt dabei raus:

Code:
$ gcc -v -o hello_world hello_world.o
Es werden eingebaute Spezifikationen verwendet.
Ziel: i486-linux-gnu
Konfiguriert mit: ../src/configure -v --with-pkgversion='Ubuntu 4.3.3-5ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread-Modell: posix
gcc-Version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)
COMPILER_PATH=/usr/lib/gcc/i486-linux-gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i486-linux-gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'hello_world' '-mtune=generic'
/usr/lib/gcc/i486-linux-gnu/4.3.3/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o hello_world -z relro /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.3.3/crtbegin.o -L/usr/lib/gcc/i486-linux-gnu/4.3.3 -L/usr/lib/gcc/i486-linux-gnu/4.3.3 -L/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/i486-linux-gnu/4.3.3/../../.. hello_world.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i486-linux-gnu/4.3.3/crtend.o /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crtn.o




Daraus habe ich mal folgendes Linker Kommando erstellt.

Code:
ld -o hello_world hello_world.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.3.3/crtbegin.o /usr/lib/gcc/i486-linux-gnu/4.3.3/crtend.o /usr/lib/crtn.o -lc



Es wird fehlerfrei ausgeführt und die Datei hello_world erstellt. Wenn ich diese aber ausführen will, so erhalte ich:

Code:
$ ./hello_world
bash: ./hello_world: No such file or directory



Welche von den vielen aufgelisteten Optionen fehlt mir? Warum erhalte ich keine Warnung?
Wie sollte das Linker-Kommando richtig heißen?

Viele Grüße
Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.07.2009, 09:58 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Ist hello_world als executable markiert? Probier mal
Code:
chmod 755 hello_world
...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.07.2009, 21:23 Uhr
Dirk1980



Daran liegt es leider nicht. Ist schon als Executable markiert.


Code:
$ ls -l hello_world
-rwxr-xr-x 1 dirk dirk 6395 2009-07-06 21:20 hello_world



Gruß
Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: