Wenn ich herausfinden, wie der Compiler analysiert, ich werde diese aktualisieren, aber zumindest muss es keine Vermutungen sein, wie es kompiliert:
objdump --disassemble /tmp/hello (edited):
080483c4 <main>:
80483c4: 55 push %ebp
80483c5: 89 e5 mov %esp,%ebp
80483c7: 83 e4 f0 and $0xfffffff0,%esp
80483ca: 83 ec 10 sub $0x10,%esp
80483cd: b8 a0 84 04 08 mov $0x80484a0,%eax
80483d2: 89 04 24 mov %eax,(%esp)
80483d5: e8 22 ff ff ff call 80482fc <[email protected]>
80483da: c9 leave
80483db: c3 ret
80483dc: 90 nop
80483dd: 90 nop
80483de: 90 nop
80483df: 90 nop
Da ausführbare Linux basieren normalerweise auf 0x8048000 ist die Adresse des Arguments printf auf einem von 0x00004a0 von Anfang der binären Offset:
xxd /tmp/hello | grep 00004a0
00004a0: 4865 6c6c 6f2c 2077 6f72 6c64 210a 0000 Hello, world!...
die Adresse des Strings also gedrückt wird, und printf wird mit, dass man arg genannt. Nichts magisches auf diesem Level, also wurde all das lustige Zeug von gcc gemacht.
Der Aufruf von 'printf' geht definitiv nicht in irgendeinen Startup-Code. –
@R ..: Das war nur eine Vermutung, und das Beste, was ich machen kann. Wo könnte es sonst noch ausgeführt werden? – casablanca
@R ..: Macht nichts, du hast recht damit und ich habe meine eigene Frage beantwortet. :) – casablanca