crt0/c0?
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
crt0/c0?
Moin,
Ich möchte ein Programm von Grund auf linken, heißt: Ich möchte auch den Linker von Hand aufrufen. Überall finde ich die Information, dass man den Linker mit /lib/crt0.o aufrufen soll.
Ich weiß, dass crt0 den Startcode des Programms darstellt und dass man den selbst assemblieren kann. Die Information, die mir fehlt ist: Muss man das?
Muss es nicht irgendwo Startcode geben, den der gcc verlinkt, wenn er ein Executable baut? Und wenn ja, wo finde ich den unter Ubuntu (bzw. Windows)? ^^
Ich möchte ein Programm von Grund auf linken, heißt: Ich möchte auch den Linker von Hand aufrufen. Überall finde ich die Information, dass man den Linker mit /lib/crt0.o aufrufen soll.
Ich weiß, dass crt0 den Startcode des Programms darstellt und dass man den selbst assemblieren kann. Die Information, die mir fehlt ist: Muss man das?
Muss es nicht irgendwo Startcode geben, den der gcc verlinkt, wenn er ein Executable baut? Und wenn ja, wo finde ich den unter Ubuntu (bzw. Windows)? ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: crt0/c0?
Kommt drauf an, wen du fragst.Xin hat geschrieben:Muss man das?
Das Betriebssystem braucht diesen Code nicht. Ein minimales aber erfolgreiches Programm sieht folgendermaßen aus:
Code: Alles auswählen
global _start
section .text
_start:
mov eax, 1
mov ebx, 0
int 0x80
Auf meinem Arch Linux-System mit gcc 7.2 werden sogar mehrere crt Dateien verwendet:Xin hat geschrieben:Muss es nicht irgendwo Startcode geben, den der gcc verlinkt, wenn er ein Executable baut? Und wenn ja, wo finde ich den unter Ubuntu (bzw. Windows)? ^^
Code: Alles auswählen
$ strace gcc main.c 2>&1 | grep crt | grep -v ENOENT
access("/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/Scrt1.o", R_OK) = 0
access("/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/crti.o", R_OK) = 0
access("/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/crtbeginS.o", R_OK) = 0
access("/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/crtendS.o", R_OK) = 0
access("/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/crtn.o", R_OK) = 0
Re: crt0/c0?
Bevor Du "von Hand" linkst, macht es sicher Sinn, erst mal gcc (dem Compiler Driver) auf die Finger zu gucken. Da kann man schon eine ganze Menge erfahren:
Damit erfährst Du, welche Executables gcc so aufruft.
Wenn Du gcc den Linker mit "Wl,-Map -Wl,mapfile" aufrufen lässt, erzeugt er dir beim Linken ein Mapfile, dem Du detailliert entnehmen kannst, was er da so zusammenlinkt.
Die nächste Steigerung wäre dann die Entsprechung zu dem Assemblercode von nufan in C (nun ja, zwar Assembler, aber immerhin in einer C-Datei
):
Wenn Du das mit gcc baust
hast Du das kürzestmögliche "C"-Programm. -nostdlib unterbindet das Einbinden von crt0.o, das Programm beginnt bei _start. Allerdings fehlt dir so die gcc Runtime (möglicherweise muss libgcc.a händisch dazugelinkt werden) und Konstruktoren werden nicht aufgerufen (so was gibt's bei gcc auch in C - __attribute__ __constructor__). Es geht also längst nicht alles, was Du in C gewohnt bist. Aber es ist mal ein Start. Was genau willst Du damit erreichen?
Code: Alles auswählen
gcc -v xxx.c
Wenn Du gcc den Linker mit "Wl,-Map -Wl,mapfile" aufrufen lässt, erzeugt er dir beim Linken ein Mapfile, dem Du detailliert entnehmen kannst, was er da so zusammenlinkt.
Die nächste Steigerung wäre dann die Entsprechung zu dem Assemblercode von nufan in C (nun ja, zwar Assembler, aber immerhin in einer C-Datei

Code: Alles auswählen
void myexit(void)
{
__asm__ __volatile__(
" .intel_syntax noprefix \n\t"
" mov eax, 1 \n\t"
" mov ebx, 0 \n\t"
" int 0x80 \n\t"
" .att_syntax \n\t"
:
:
);
}
void _start(void)
{
myexit();
}
Code: Alles auswählen
gcc -Wl,-Map -Wl,mapfile -nostdlib -o tst tst.c
It's as simple as that. And remember, Beethoven wrote his first symphony in C.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: crt0/c0?
Genau, so stelle ich mir das auch vor.nufan hat geschrieben:Alles was das Betriebssystem braucht, ist ein "_start" Einstiegspunkt. Im Falle eines mit gcc kompilierten C-Programms wird dieser von crt bereitgestellt. Sinn dahinter ist die Aufbereitung von z.B. argc und argv. Ich kann mir auch gut vorstellen, dass Funktionen wie atexit() von crt abhängig sind.

Da ich den Build-Prozess von Hand nachbilden will, fehlt mir nun diese Information, weswegen ich mit dem Linker kein brauchbrares Executable hinbekomme. ^^
Unter Ubuntu scheinen das drei Dateien zu sein: crt1, crti und crtn.
Wenn ich die zum Linken dazu nehme, kann ich das Programm linken, wenn ich es allerdings ausführen will schreibt er:
Code: Alles auswählen
xin@cypher:~/try/hworld$ ls -la hworld
-rwxrwxr-x 1 xin xin 7136 Nov 10 22:00 hworld
xin@cypher:~/try/hworld$ ./hworld
bash: ./hworld: Datei oder Verzeichnis nicht gefunden
Da kommt bei mir nichts raus.nufan hat geschrieben:Auf meinem Arch Linux-System mit gcc 7.2 werden sogar mehrere crt Dateien verwendet:Xin hat geschrieben:Muss es nicht irgendwo Startcode geben, den der gcc verlinkt, wenn er ein Executable baut? Und wenn ja, wo finde ich den unter Ubuntu (bzw. Windows)? ^^Code: Alles auswählen
$ strace gcc main.c 2>&1 | grep crt | grep -v ENOENT
Ich habe die drei jetzt gefunden, in dem ich einfach main start genannt habe und den gcc das habe kompilieren lassen. Mit dem Ergebnis, dass es ein Linkerfehler gebt mit dem Objectfile, wo start bereits definiert wird und so habe ich es dann gefunden.
Aber irgendwas hakt noch, nur das jetzt zu suchen, dafür bin ich jetzt zu müde

Verstehen und den fehlenden Artikel in start: fertig schreiben. Ich weiß zwar grundsätzlich, wie ein Programm kompiliert wird und wie es geladen wird, aber wenn man dann so einen Artikel schreibt und das ganze nochmal tatsächlich nachvollziehen will, um es anschließend erklären zu können, da lernt man doch wieder einiges dazu.mfro hat geschrieben:Wenn Du das mit gcc baustDas sieht interssant aus, das werde ich mir nochmal genauer geben.Code: Alles auswählen
gcc -Wl,-Map -Wl,mapfile -nostdlib -o tst tst.c
Aktuell bin ich auf der Meeting C++ in Berlin und aktuell eher ziemlich platt.
Aber das erklärt mir mit dem Interrupt jedenfalls schonmal, warum mein Versuch abschmierte... In x86 Asm bin ich noch recht frisch unterwegs und in meiner Zeit vom Amiga endete ein Programm ganz einfach mit dem "ret". Also habe ich den Interrupt so nicht vor Augen gehabt.
mfro hat geschrieben:hast Du das kürzestmögliche "C"-Programm. -nostdlib unterbindet das Einbinden von crt0.o, das Programm beginnt bei _start. Allerdings fehlt dir so die gcc Runtime (möglicherweise muss libgcc.a händisch dazugelinkt werden) und Konstruktoren werden nicht aufgerufen (so was gibt's bei gcc auch in C - __attribute__ __constructor__). Es geht also längst nicht alles, was Du in C gewohnt bist. Aber es ist mal ein Start. Was genau willst Du damit erreichen?

Seit ich sowas vor 20 Jahren auf dem Amiga gemacht habe, hat sich für mich die Hardware und das OS geändert. Ein paar Dinge sind dann doch anders und die Dokumentation dazu ist überschaubar, weswegen ich das jetzt ja auch nachvollziehen und erklären will.
Und offensichtlich läuft es auf den unterschiedlichen Linux-Versionen auch unterschiedlich, denn unter Nufans Arch Linux findet sich die crt0.o, unter Ubuntu gibt's es sie nicht. Nun da ich weiß, wie sie heißen, habe ich wieder Suchbegriffe für Google

Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: crt0/c0?
Hast du strace installiert? grep in Kombination mit "2>&1" schluckt die entsprechende Fehlermeldung.Xin hat geschrieben:Da kommt bei mir nichts raus.nufan hat geschrieben:Auf meinem Arch Linux-System mit gcc 7.2 werden sogar mehrere crt Dateien verwendet:Xin hat geschrieben:Muss es nicht irgendwo Startcode geben, den der gcc verlinkt, wenn er ein Executable baut? Und wenn ja, wo finde ich den unter Ubuntu (bzw. Windows)? ^^Code: Alles auswählen
$ strace gcc main.c 2>&1 | grep crt | grep -v ENOENT
Was gibt dennXin hat geschrieben:Wenn ich die zum Linken dazu nehme, kann ich das Programm linken, wenn ich es allerdings ausführen will schreibt er:
Code: Alles auswählen
xin@cypher:~/try/hworld$ ls -la hworld -rwxrwxr-x 1 xin xin 7136 Nov 10 22:00 hworld xin@cypher:~/try/hworld$ ./hworld bash: ./hworld: Datei oder Verzeichnis nicht gefunden
Code: Alles auswählen
$ ldd hworld
Code: Alles auswählen
$ readelf -h hworld
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: crt0/c0?
Hey, nufan:
Gleich geht die MeetingC++ weiter, entsprechend sind die Chancen überschaubar, heute nochmal online zu kommen.
Code: Alles auswählen
xin@cypher:~/try/hworld$ strace -V
strace -- version 4.15
xin@cypher:~/try/hworld$ ldd hworld
linux-vdso.so.1 => (0x00007fff7a365000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d461aa000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2d4678c000)
xin@cypher:~/try/hworld$ readelf -h hworld
ELF-Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Klasse: ELF64
Daten: 2er-Komplement, Little-Endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI-Version: 0
Typ: DYN (geteilte Objektadatei)
Maschine: Advanced Micro Devices X86-64
Version: 0x1
Einstiegspunktadresse: 0x530
Beginn der Programm-Header: 64 (Bytes in Datei)
Beginn der Sektions-header: 6440 (Bytes in Datei)
Flags: 0x0
Größe dieses Headers: 64 (Byte)
Größe der Programm-Header: 56 (Byte)
Number of program headers: 9
Größe der Sektions-Header: 64 (bytes)
Anzahl der Sektions-Header: 29
Sektions-Header Stringtabellen-Index: 28
xin@cypher:~/try/hworld$
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: crt0/c0?
Ich hatte mir irgendwie etwas anderes erhofft
Ohne das Programm bin ich gerade etwas planlos, vielleicht kannst du mir das mal schicken.

- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: crt0/c0?
Das ist ein kein Problem: Es ist ein einfaches Hello World.
Interessanter dürfte die ToolChain sein, welche aber wohl nicht unbedingt 1:1 übertragen werden kann. Vielleicht brauche ich mal eine testweise eine VM mit ArchLinux, aber das geht gerade nicht - ich bin derzeit im ICE von der MeetingC++ nach Hause. Konferenz war gut, aber was mich geärgert hat ist dass 6 Studenten gar nicht erschienen sind. :-/
Nächstes Jahr!
Naja, die Toolchain:
Das sieht dann so aus:
und daraus erhalte ich folgendes:
Da gab es schonmal bessere Fehlermeldungen. ^^
Aktuell weiß ich vorrangig, dass ich weniger Symbole habe, aber _start ist drin. Bzgl. der Libraries sieht das auch gut aus:
hworldc ist das Programm direkt mit "gcc hworld.c -o hworldc" kompiliert.
Ich rate weiter... aber ich glaube, das wird heute eh nichts mehr. Ich laufe schon auf Energie-Drinks. Wir sind beim Post-Conference-Dinner "etwas" versackt und heute früh stand nach kurzer Nacht der Zimmerservice im Zimmer. An ein "Don't Disturb" hatte ich nicht mehr gedacht
Interessanter dürfte die ToolChain sein, welche aber wohl nicht unbedingt 1:1 übertragen werden kann. Vielleicht brauche ich mal eine testweise eine VM mit ArchLinux, aber das geht gerade nicht - ich bin derzeit im ICE von der MeetingC++ nach Hause. Konferenz war gut, aber was mich geärgert hat ist dass 6 Studenten gar nicht erschienen sind. :-/
Nächstes Jahr!
Naja, die Toolchain:
Das sieht dann so aus:
Code: Alles auswählen
gcc -S hworld.c -o hworld.s
as hworld.s -o hworld.o
ld /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o hworld.o -o hworld -lc
Code: Alles auswählen
xin@cypher:~/try/hworld$ ls -la hworld
-rwxrwxr-x 1 xin xin 7136 Nov 12 20:37 hworld
xin@cypher:~/try/hworld$ ./hworld
bash: ./hworld: Datei oder Verzeichnis nicht gefunden
Aktuell weiß ich vorrangig, dass ich weniger Symbole habe, aber _start ist drin. Bzgl. der Libraries sieht das auch gut aus:
Code: Alles auswählen
xin@cypher:~/try/hworld$ ldd -d hworld
linux-vdso.so.1 => (0x00007ffdcb195000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbfbc530000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007fbfbc910000)
xin@cypher:~/try/hworld$ ldd -d hworldc
linux-vdso.so.1 => (0x00007ffc967f6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3b9caba000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3b9d09c000)
Ich rate weiter... aber ich glaube, das wird heute eh nichts mehr. Ich laufe schon auf Energie-Drinks. Wir sind beim Post-Conference-Dinner "etwas" versackt und heute früh stand nach kurzer Nacht der Zimmerservice im Zimmer. An ein "Don't Disturb" hatte ich nicht mehr gedacht

Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: crt0/c0?
mach' mal readelf -a auf das Executable und auf ein "normal" compiliertes/gelinktes Programm.
Da wird (hoffentlich) klar, warum das nicht funktioniert.
Da wird (hoffentlich) klar, warum das nicht funktioniert.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: crt0/c0?
Typ ist interessant...
mit gcc kompiliert:
mit ld gelinkt:
mit gcc kompiliert:
Code: Alles auswählen
xin@cypher:~/try/hworld$ readelf -a hworldc
ELF-Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Klasse: ELF64
Daten: 2er-Komplement, Little-Endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI-Version: 0
Typ: DYN (geteilte Objektadatei)
Maschine: Advanced Micro Devices X86-64
Version: 0x1
Einstiegspunktadresse: 0x530
Beginn der Programm-Header: 64 (Bytes in Datei)
Beginn der Sektions-header: 6440 (Bytes in Datei)
Flags: 0x0
Größe dieses Headers: 64 (Byte)
Größe der Programm-Header: 56 (Byte)
Number of program headers: 9
Größe der Sektions-Header: 64 (bytes)
Anzahl der Sektions-Header: 29
Sektions-Header Stringtabellen-Index: 28
Sektions-Header:
[Nr] Name Typ Adresse Offset
Größe Eintragsgröße Flags Link Info Ausr.
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000000238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000000254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .note.gnu.build-i NOTE 0000000000000274 00000274
0000000000000024 0000000000000000 A 0 0 4
[ 4] .gnu.hash GNU_HASH 0000000000000298 00000298
000000000000001c 0000000000000000 A 5 0 8
[ 5] .dynsym DYNSYM 00000000000002b8 000002b8
00000000000000a8 0000000000000018 A 6 1 8
[ 6] .dynstr STRTAB 0000000000000360 00000360
0000000000000082 0000000000000000 A 0 0 1
[ 7] .gnu.version VERSYM 00000000000003e2 000003e2
000000000000000e 0000000000000002 A 5 0 2
[ 8] .gnu.version_r VERNEED 00000000000003f0 000003f0
0000000000000020 0000000000000000 A 6 1 8
[ 9] .rela.dyn RELA 0000000000000410 00000410
00000000000000c0 0000000000000018 A 5 0 8
[10] .rela.plt RELA 00000000000004d0 000004d0
0000000000000018 0000000000000018 AI 5 22 8
[11] .init PROGBITS 00000000000004e8 000004e8
0000000000000017 0000000000000000 AX 0 0 4
[12] .plt PROGBITS 0000000000000500 00000500
0000000000000020 0000000000000010 AX 0 0 16
[13] .plt.got PROGBITS 0000000000000520 00000520
0000000000000008 0000000000000008 AX 0 0 8
[14] .text PROGBITS 0000000000000530 00000530
00000000000001a2 0000000000000000 AX 0 0 16
[15] .fini PROGBITS 00000000000006d4 000006d4
0000000000000009 0000000000000000 AX 0 0 4
[16] .rodata PROGBITS 00000000000006e0 000006e0
0000000000000010 0000000000000000 A 0 0 4
[17] .eh_frame_hdr PROGBITS 00000000000006f0 000006f0
000000000000003c 0000000000000000 A 0 0 4
[18] .eh_frame PROGBITS 0000000000000730 00000730
0000000000000108 0000000000000000 A 0 0 8
[19] .init_array INIT_ARRAY 0000000000200db8 00000db8
0000000000000008 0000000000000008 WA 0 0 8
[20] .fini_array FINI_ARRAY 0000000000200dc0 00000dc0
0000000000000008 0000000000000008 WA 0 0 8
[21] .dynamic DYNAMIC 0000000000200dc8 00000dc8
00000000000001f0 0000000000000010 WA 6 0 8
[22] .got PROGBITS 0000000000200fb8 00000fb8
0000000000000048 0000000000000008 WA 0 0 8
[23] .data PROGBITS 0000000000201000 00001000
0000000000000010 0000000000000000 WA 0 0 8
[24] .bss NOBITS 0000000000201010 00001010
0000000000000008 0000000000000000 WA 0 0 1
[25] .comment PROGBITS 0000000000000000 00001010
0000000000000023 0000000000000001 MS 0 0 1
[26] .symtab SYMTAB 0000000000000000 00001038
00000000000005e8 0000000000000018 27 43 8
[27] .strtab STRTAB 0000000000000000 00001620
0000000000000204 0000000000000000 0 0 1
[28] .shstrtab STRTAB 0000000000000000 00001824
00000000000000fe 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
l (large), p (processor specific)
Es gibt keine Sektionsgruppen in dieser Datei.
Programm-Header:
Typ Offset VirtAdr PhysAdr
DateiGr SpeiGr Flags Ausr.
PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
0x00000000000001f8 0x00000000000001f8 R E 0x8
INTERP 0x0000000000000238 0x0000000000000238 0x0000000000000238
0x000000000000001c 0x000000000000001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000838 0x0000000000000838 R E 0x200000
LOAD 0x0000000000000db8 0x0000000000200db8 0x0000000000200db8
0x0000000000000258 0x0000000000000260 RW 0x200000
DYNAMIC 0x0000000000000dc8 0x0000000000200dc8 0x0000000000200dc8
0x00000000000001f0 0x00000000000001f0 RW 0x8
NOTE 0x0000000000000254 0x0000000000000254 0x0000000000000254
0x0000000000000044 0x0000000000000044 R 0x4
GNU_EH_FRAME 0x00000000000006f0 0x00000000000006f0 0x00000000000006f0
0x000000000000003c 0x000000000000003c R 0x4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x10
GNU_RELRO 0x0000000000000db8 0x0000000000200db8 0x0000000000200db8
0x0000000000000248 0x0000000000000248 R 0x1
Abbildung von Sektion nach Segment:
Segmentsektionen...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .dynamic .got .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .dynamic .got
Dynamic section at offset 0xdc8 contains 27 entries:
Tag Typ Name/Wert
0x0000000000000001 (NEEDED) Gemeinsame Bibliothek [libc.so.6]
0x000000000000000c (INIT) 0x4e8
0x000000000000000d (FINI) 0x6d4
0x0000000000000019 (INIT_ARRAY) 0x200db8
0x000000000000001b (INIT_ARRAYSZ) 8 (Bytes)
0x000000000000001a (FINI_ARRAY) 0x200dc0
0x000000000000001c (FINI_ARRAYSZ) 8 (Bytes)
0x000000006ffffef5 (GNU_HASH) 0x298
0x0000000000000005 (STRTAB) 0x360
0x0000000000000006 (SYMTAB) 0x2b8
0x000000000000000a (STRSZ) 130 (Bytes)
0x000000000000000b (SYMENT) 24 (Bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x200fb8
0x0000000000000002 (PLTRELSZ) 24 (Bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x4d0
0x0000000000000007 (RELA) 0x410
0x0000000000000008 (RELASZ) 192 (Bytes)
0x0000000000000009 (RELAENT) 24 (Bytes)
0x000000000000001e (FLAGS) BIND_NOW
0x000000006ffffffb (FLAGS_1) Flags: NOW PIE
0x000000006ffffffe (VERNEED) 0x3f0
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x3e2
0x000000006ffffff9 (RELACOUNT) 3
0x0000000000000000 (NULL) 0x0
Relozierungssektion '.rela.dyn' an Offset 0x410 enhält 8 Einträge:
Offset Info Typ Sym.-Wert Sym.-Name+Summand
000000200db8 000000000008 R_X86_64_RELATIVE 630
000000200dc0 000000000008 R_X86_64_RELATIVE 5f0
000000201008 000000000008 R_X86_64_RELATIVE 201008
000000200fd8 000100000006 R_X86_64_GLOB_DAT 0000000000000000 _ITM_deregisterTMClone + 0
000000200fe0 000300000006 R_X86_64_GLOB_DAT 0000000000000000 __libc_start_main@GLIBC_2.2.5 + 0
000000200fe8 000400000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
000000200ff0 000500000006 R_X86_64_GLOB_DAT 0000000000000000 _ITM_registerTMCloneTa + 0
000000200ff8 000600000006 R_X86_64_GLOB_DAT 0000000000000000 __cxa_finalize@GLIBC_2.2.5 + 0
Relozierungssektion '.rela.plt' an Offset 0x4d0 enhält 1 Einträge:
Offset Info Typ Sym.-Wert Sym.-Name+Summand
000000200fd0 000200000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0
The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported.
Symboltabelle ‚.dynsym‛ enthält 7 Einträge:
Num: Wert Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable
6: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2)
Symboltabelle ‚.symtab‛ enthält 63 Einträge:
Num: Wert Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000238 0 SECTION LOCAL DEFAULT 1
2: 0000000000000254 0 SECTION LOCAL DEFAULT 2
3: 0000000000000274 0 SECTION LOCAL DEFAULT 3
4: 0000000000000298 0 SECTION LOCAL DEFAULT 4
5: 00000000000002b8 0 SECTION LOCAL DEFAULT 5
6: 0000000000000360 0 SECTION LOCAL DEFAULT 6
7: 00000000000003e2 0 SECTION LOCAL DEFAULT 7
8: 00000000000003f0 0 SECTION LOCAL DEFAULT 8
9: 0000000000000410 0 SECTION LOCAL DEFAULT 9
10: 00000000000004d0 0 SECTION LOCAL DEFAULT 10
11: 00000000000004e8 0 SECTION LOCAL DEFAULT 11
12: 0000000000000500 0 SECTION LOCAL DEFAULT 12
13: 0000000000000520 0 SECTION LOCAL DEFAULT 13
14: 0000000000000530 0 SECTION LOCAL DEFAULT 14
15: 00000000000006d4 0 SECTION LOCAL DEFAULT 15
16: 00000000000006e0 0 SECTION LOCAL DEFAULT 16
17: 00000000000006f0 0 SECTION LOCAL DEFAULT 17
18: 0000000000000730 0 SECTION LOCAL DEFAULT 18
19: 0000000000200db8 0 SECTION LOCAL DEFAULT 19
20: 0000000000200dc0 0 SECTION LOCAL DEFAULT 20
21: 0000000000200dc8 0 SECTION LOCAL DEFAULT 21
22: 0000000000200fb8 0 SECTION LOCAL DEFAULT 22
23: 0000000000201000 0 SECTION LOCAL DEFAULT 23
24: 0000000000201010 0 SECTION LOCAL DEFAULT 24
25: 0000000000000000 0 SECTION LOCAL DEFAULT 25
26: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
27: 0000000000000560 0 FUNC LOCAL DEFAULT 14 deregister_tm_clones
28: 00000000000005a0 0 FUNC LOCAL DEFAULT 14 register_tm_clones
29: 00000000000005f0 0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux
30: 0000000000201010 1 OBJECT LOCAL DEFAULT 24 completed.7632
31: 0000000000200dc0 0 OBJECT LOCAL DEFAULT 20 __do_global_dtors_aux_fin
32: 0000000000000630 0 FUNC LOCAL DEFAULT 14 frame_dummy
33: 0000000000200db8 0 OBJECT LOCAL DEFAULT 19 __frame_dummy_init_array_
34: 0000000000000000 0 FILE LOCAL DEFAULT ABS hworld.c
35: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
36: 0000000000000834 0 OBJECT LOCAL DEFAULT 18 __FRAME_END__
37: 0000000000000000 0 FILE LOCAL DEFAULT ABS
38: 0000000000200dc0 0 NOTYPE LOCAL DEFAULT 19 __init_array_end
39: 0000000000200dc8 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC
40: 0000000000200db8 0 NOTYPE LOCAL DEFAULT 19 __init_array_start
41: 00000000000006f0 0 NOTYPE LOCAL DEFAULT 17 __GNU_EH_FRAME_HDR
42: 0000000000200fb8 0 OBJECT LOCAL DEFAULT 22 _GLOBAL_OFFSET_TABLE_
43: 00000000000006d0 2 FUNC GLOBAL DEFAULT 14 __libc_csu_fini
44: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab
45: 0000000000201000 0 NOTYPE WEAK DEFAULT 23 data_start
46: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.2.5
47: 0000000000201010 0 NOTYPE GLOBAL DEFAULT 23 _edata
48: 00000000000006d4 0 FUNC GLOBAL DEFAULT 15 _fini
49: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
50: 0000000000201000 0 NOTYPE GLOBAL DEFAULT 23 __data_start
51: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
52: 0000000000201008 0 OBJECT GLOBAL HIDDEN 23 __dso_handle
53: 00000000000006e0 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used
54: 0000000000000660 101 FUNC GLOBAL DEFAULT 14 __libc_csu_init
55: 0000000000201018 0 NOTYPE GLOBAL DEFAULT 24 _end
56: 0000000000000530 43 FUNC GLOBAL DEFAULT 14 _start
57: 0000000000201010 0 NOTYPE GLOBAL DEFAULT 24 __bss_start
58: 000000000000063a 23 FUNC GLOBAL DEFAULT 14 main
59: 0000000000201010 0 OBJECT GLOBAL HIDDEN 23 __TMC_END__
60: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable
61: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.2
62: 00000000000004e8 0 FUNC GLOBAL DEFAULT 11 _init
Version symbols section '.gnu.version' contains 7 entries:
Adr: 00000000000003e2 Offset: 0x0003e2 Link: 5 (.dynsym)
000: 0 (*lokal*) 0 (*lokal*) 2 (GLIBC_2.2.5) 2 (GLIBC_2.2.5)
004: 0 (*lokal*) 0 (*lokal*) 2 (GLIBC_2.2.5)
Version needs section '.gnu.version_r' contains 1 entries:
Adr: 0x00000000000003f0 Offset: 0x0003f0 Link: 6 (.dynstr)
000000: Version: 1 Datei: libc.so.6 Zähler: 1
0x0010: Name: GLIBC_2.2.5 Flags: nichts Version: 2
Displaying notes found in: .note.ABI-tag
Besitzer Datengröße Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
OS: Linux, ABI: 3.2.0
Displaying notes found in: .note.gnu.build-id
Besitzer Datengröße Description
GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)
Build-ID: 468dedcf7669cbd1fbd50463fe688ed79889550b
Code: Alles auswählen
xin@cypher:~/try/hworld$ readelf -a hworld
ELF-Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Klasse: ELF64
Daten: 2er-Komplement, Little-Endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI-Version: 0
Typ: EXEC (ausführbare Datei)
Maschine: Advanced Micro Devices X86-64
Version: 0x1
Einstiegspunktadresse: 0x4003a0
Beginn der Programm-Header: 64 (Bytes in Datei)
Beginn der Sektions-header: 5600 (Bytes in Datei)
Flags: 0x0
Größe dieses Headers: 64 (Byte)
Größe der Programm-Header: 56 (Byte)
Number of program headers: 8
Größe der Sektions-Header: 64 (bytes)
Anzahl der Sektions-Header: 24
Sektions-Header Stringtabellen-Index: 23
Sektions-Header:
[Nr] Name Typ Adresse Offset
Größe Eintragsgröße Flags Link Info Ausr.
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400200 00000200
000000000000000f 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400210 00000210
0000000000000020 0000000000000000 A 0 0 4
[ 3] .hash HASH 0000000000400230 00000230
0000000000000024 0000000000000004 A 4 0 8
[ 4] .dynsym DYNSYM 0000000000400258 00000258
0000000000000060 0000000000000018 A 5 1 8
[ 5] .dynstr STRTAB 00000000004002b8 000002b8
000000000000003d 0000000000000000 A 0 0 1
[ 6] .gnu.version VERSYM 00000000004002f6 000002f6
0000000000000008 0000000000000002 A 4 0 2
[ 7] .gnu.version_r VERNEED 0000000000400300 00000300
0000000000000020 0000000000000000 A 5 1 8
[ 8] .rela.dyn RELA 0000000000400320 00000320
0000000000000030 0000000000000018 A 4 0 8
[ 9] .rela.plt RELA 0000000000400350 00000350
0000000000000018 0000000000000018 AI 4 18 8
[10] .init PROGBITS 0000000000400368 00000368
0000000000000017 0000000000000000 AX 0 0 4
[11] .plt PROGBITS 0000000000400380 00000380
0000000000000020 0000000000000010 AX 0 0 16
[12] .text PROGBITS 00000000004003a0 000003a0
00000000000000c2 0000000000000000 AX 0 0 16
[13] .fini PROGBITS 0000000000400464 00000464
0000000000000009 0000000000000000 AX 0 0 4
[14] .rodata PROGBITS 0000000000400470 00000470
0000000000000010 0000000000000000 A 0 0 4
[15] .eh_frame PROGBITS 0000000000400480 00000480
00000000000000ec 0000000000000000 A 0 0 8
[16] .dynamic DYNAMIC 0000000000600e60 00000e60
0000000000000190 0000000000000010 WA 5 0 8
[17] .got PROGBITS 0000000000600ff0 00000ff0
0000000000000010 0000000000000008 WA 0 0 8
[18] .got.plt PROGBITS 0000000000601000 00001000
0000000000000020 0000000000000008 WA 0 0 8
[19] .data PROGBITS 0000000000601020 00001020
0000000000000004 0000000000000000 WA 0 0 1
[20] .comment PROGBITS 0000000000000000 00001024
0000000000000023 0000000000000001 MS 0 0 1
[21] .symtab SYMTAB 0000000000000000 00001048
00000000000003f0 0000000000000018 22 27 8
[22] .strtab STRTAB 0000000000000000 00001438
00000000000000e1 0000000000000000 0 0 1
[23] .shstrtab STRTAB 0000000000000000 00001519
00000000000000c1 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
l (large), p (processor specific)
Es gibt keine Sektionsgruppen in dieser Datei.
Programm-Header:
Typ Offset VirtAdr PhysAdr
DateiGr SpeiGr Flags Ausr.
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001c0 0x00000000000001c0 R E 0x8
INTERP 0x0000000000000200 0x0000000000400200 0x0000000000400200
0x000000000000000f 0x000000000000000f R 0x1
[Requesting program interpreter: /lib/ld64.so.1]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000056c 0x000000000000056c R E 0x200000
LOAD 0x0000000000000e60 0x0000000000600e60 0x0000000000600e60
0x00000000000001c4 0x00000000000001c4 RW 0x200000
DYNAMIC 0x0000000000000e60 0x0000000000600e60 0x0000000000600e60
0x0000000000000190 0x0000000000000190 RW 0x8
NOTE 0x0000000000000210 0x0000000000400210 0x0000000000400210
0x0000000000000020 0x0000000000000020 R 0x4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x10
GNU_RELRO 0x0000000000000e60 0x0000000000600e60 0x0000000000600e60
0x00000000000001a0 0x00000000000001a0 R 0x1
Abbildung von Sektion nach Segment:
Segmentsektionen...
00
01 .interp
02 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame
03 .dynamic .got .got.plt .data
04 .dynamic
05 .note.ABI-tag
06
07 .dynamic .got
Dynamic section at offset 0xe60 contains 20 entries:
Tag Typ Name/Wert
0x0000000000000001 (NEEDED) Gemeinsame Bibliothek [libc.so.6]
0x000000000000000c (INIT) 0x400368
0x000000000000000d (FINI) 0x400464
0x0000000000000004 (HASH) 0x400230
0x0000000000000005 (STRTAB) 0x4002b8
0x0000000000000006 (SYMTAB) 0x400258
0x000000000000000a (STRSZ) 61 (Bytes)
0x000000000000000b (SYMENT) 24 (Bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x601000
0x0000000000000002 (PLTRELSZ) 24 (Bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x400350
0x0000000000000007 (RELA) 0x400320
0x0000000000000008 (RELASZ) 48 (Bytes)
0x0000000000000009 (RELAENT) 24 (Bytes)
0x000000006ffffffe (VERNEED) 0x400300
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x4002f6
0x0000000000000000 (NULL) 0x0
Relozierungssektion '.rela.dyn' an Offset 0x320 enhält 2 Einträge:
Offset Info Typ Sym.-Wert Sym.-Name+Summand
000000600ff0 000200000006 R_X86_64_GLOB_DAT 0000000000000000 __libc_start_main@GLIBC_2.2.5 + 0
000000600ff8 000300000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
Relozierungssektion '.rela.plt' an Offset 0x350 enhält 1 Einträge:
Offset Info Typ Sym.-Wert Sym.-Name+Summand
000000601018 000100000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0
The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported.
Symboltabelle ‚.dynsym‛ enthält 4 Einträge:
Num: Wert Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
Symboltabelle ‚.symtab‛ enthält 42 Einträge:
Num: Wert Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400200 0 SECTION LOCAL DEFAULT 1
2: 0000000000400210 0 SECTION LOCAL DEFAULT 2
3: 0000000000400230 0 SECTION LOCAL DEFAULT 3
4: 0000000000400258 0 SECTION LOCAL DEFAULT 4
5: 00000000004002b8 0 SECTION LOCAL DEFAULT 5
6: 00000000004002f6 0 SECTION LOCAL DEFAULT 6
7: 0000000000400300 0 SECTION LOCAL DEFAULT 7
8: 0000000000400320 0 SECTION LOCAL DEFAULT 8
9: 0000000000400350 0 SECTION LOCAL DEFAULT 9
10: 0000000000400368 0 SECTION LOCAL DEFAULT 10
11: 0000000000400380 0 SECTION LOCAL DEFAULT 11
12: 00000000004003a0 0 SECTION LOCAL DEFAULT 12
13: 0000000000400464 0 SECTION LOCAL DEFAULT 13
14: 0000000000400470 0 SECTION LOCAL DEFAULT 14
15: 0000000000400480 0 SECTION LOCAL DEFAULT 15
16: 0000000000600e60 0 SECTION LOCAL DEFAULT 16
17: 0000000000600ff0 0 SECTION LOCAL DEFAULT 17
18: 0000000000601000 0 SECTION LOCAL DEFAULT 18
19: 0000000000601020 0 SECTION LOCAL DEFAULT 19
20: 0000000000000000 0 SECTION LOCAL DEFAULT 20
21: 0000000000000000 0 FILE LOCAL DEFAULT ABS hworld.c
22: 0000000000000000 0 FILE LOCAL DEFAULT ABS
23: 0000000000600e60 0 NOTYPE LOCAL DEFAULT 16 __init_array_end
24: 0000000000600e60 0 OBJECT LOCAL DEFAULT 16 _DYNAMIC
25: 0000000000600e60 0 NOTYPE LOCAL DEFAULT 16 __init_array_start
26: 0000000000601000 0 OBJECT LOCAL DEFAULT 18 _GLOBAL_OFFSET_TABLE_
27: 0000000000400460 2 FUNC GLOBAL DEFAULT 12 __libc_csu_fini
28: 0000000000601020 0 NOTYPE WEAK DEFAULT 19 data_start
29: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.2.5
30: 0000000000601024 0 NOTYPE GLOBAL DEFAULT 19 _edata
31: 0000000000400464 0 FUNC GLOBAL DEFAULT 13 _fini
32: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
33: 0000000000601020 0 NOTYPE GLOBAL DEFAULT 19 __data_start
34: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
35: 0000000000400470 4 OBJECT GLOBAL DEFAULT 14 _IO_stdin_used
36: 00000000004003f0 101 FUNC GLOBAL DEFAULT 12 __libc_csu_init
37: 0000000000601028 0 NOTYPE GLOBAL DEFAULT 19 _end
38: 00000000004003a0 43 FUNC GLOBAL DEFAULT 12 _start
39: 0000000000601024 0 NOTYPE GLOBAL DEFAULT 19 __bss_start
40: 00000000004003cb 23 FUNC GLOBAL DEFAULT 12 main
41: 0000000000400368 0 FUNC GLOBAL DEFAULT 10 _init
Histogramm der Bucketlistenl-Länge (von insgesamt 3 Buckets):
Länge Nummer % von insg. Abdeckung
0 2 ( 66.7%)
1 0 ( 0.0%) 0.0%
2 1 ( 33.3%) 100.0%
Version symbols section '.gnu.version' contains 4 entries:
Adr: 00000000004002f6 Offset: 0x0002f6 Link: 4 (.dynsym)
000: 0 (*lokal*) 2 (GLIBC_2.2.5) 2 (GLIBC_2.2.5) 0 (*lokal*)
Version needs section '.gnu.version_r' contains 1 entries:
Adr: 0x0000000000400300 Offset: 0x000300 Link: 5 (.dynstr)
000000: Version: 1 Datei: libc.so.6 Zähler: 1
0x0010: Name: GLIBC_2.2.5 Flags: nichts Version: 2
Displaying notes found in: .note.ABI-tag
Besitzer Datengröße Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
OS: Linux, ABI: 3.2.0
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.