Si puedo averiguar cómo el compilador analiza que, voy a actualizar esto, pero al menos es necesario que haya ninguna conjetura en cuanto a cómo se compila:
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
Desde ejecutables Linux se basan normalmente en 0x8048000 , la dirección del argumento de printf está en un desplazamiento de 0x00004a0 desde el inicio de la binaria:
xxd /tmp/hello | grep 00004a0
00004a0: 4865 6c6c 6f2c 2077 6f72 6c64 210a 0000 Hello, world!...
por lo tanto, la dirección de la cadena es empujada, y printf se llama con que uno arg. Nada mágico en ese nivel, así que todo lo divertido lo hizo gcc.
La llamada a 'printf' definitivamente no va en ningún código de inicio pre-' main '. –
@R ..: Eso fue solo una suposición, y lo mejor que puedo hacer. ¿Dónde más podría posiblemente ejecutarse? – casablanca
@R ..: No importa, tienes razón al respecto y respondí mi propia pregunta. :) – casablanca