Intenté esto, pero me quedé con la respuesta debajo de las preguntas donde hello_world-1.c
#include<stdio.h> int main(void) { printf("Hello world\n"); return 0; }Los comandos ejecutados:
[kishore@localhost-localdomain ~]$ gcc -Wall -Wextra -c hello_world-1.c [kishore@localhost-localdomain ~]$ gcc -o hello_world-1 hello_world-1.o [kishore@localhost-localdomain ~]$ size hello_world-1 hello_world-1.o text data bss dec hex filename 1222 280 4 1506 5e2 hello_world-1 139 0 0 139 8b hello_world-1.o [kishore@localhost-localdomain ~]$ objdump -h hello_world-1.o hello_world-1.o: file format elf32-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000003b 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 00000000 00000000 0000006f 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 0000006f 2**0 ALLOC 3 .rodata 0000000c 00000000 00000000 0000006f 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .comment 0000002d 00000000 00000000 0000007b 2**0 CONTENTS, READONLY 5 .note.GNU-stack 00000000 00000000 00000000 000000a8 2**0 CONTENTS, READONLY 6 .eh_frame 00000044 00000000 00000000 000000a8 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA¿Puede alguien ayudarme a averiguar cuáles podrían ser las razones de las preguntas a continuación?
size no enumeró un segmento de pila o montón para hello_world o hello_world.o . ¿Cuál podría ser la razón detrás de esto? (para la pregunta anterior, la respuesta es que no llamé a ninguna función y tampoco usé ningún segmento de montón, es por eso que no aparecieron aquí. ¿Estoy en lo correcto?)hello_world-1.c . ¿Por qué el size informa que los segmentos de datos y bss tienen una longitud cero para el archivo de objeto pero una longitud distinta de cero para el ejecutable ?size y objdump reportan diferentes tamaños para el segmento de texto . ¿Puede indicar de dónde proviene la discrepancia?Lo he intentado pero no he podido concluir sobre las 3 preguntas anteriores. Agradezco su ayuda en esto.
1) El sistema operativo crea el montón y la pila en tiempo de ejecución; es decir, después de que el ejecutable se haya cargado en la memoria virtual. Por lo tanto, no forman parte del archivo ejecutable.
2) Porque el ejecutable también contiene datos, y código, claro, de la biblioteca stdio que el enlazador ha vinculado al archivo de objeto.
3) Porque size , invocado así (sin ningún parámetro) muestra los tamaños de acuerdo con la convención de Berkeley. Bajo este escenario, la entrada de text informa los tamaños combinados de tres segmentos diferentes:
.text
.rodata
.eh_frame
Por otro lado, objdump solo informa el tamaño de .text . Puede ver los tamaños de .text , .rodata y .eh_frame por separado con size si lo invoca de acuerdo con la convención SysV, así: size -A hello_world-1.c . Luego verá exactamente la misma información que ve con objdump .
Espero que esto ayude.
Para la pregunta #2. Esto se debe a que hay pocas variables globales predeterminadas definidas cuando se realiza la vinculación para crear un ejecutable. El siguiente comando puede mostrar la tabla de símbolos. Dos variables de 4 bytes cada una son __data_start y __bss_start.
objdump -x hola_mundo-1
0000000000601030 g .data 0000000000000000 __data_start
0000000000601034 g .bss 0000000000000000 __bss_start
Para la pregunta n.º 1, Stack y Heap no se mencionarán en el ejecutable porque el sistema operativo los asigna dinámicamente. El archivo binario solo proporciona secciones que son de naturaleza estática. Me gusta, el contenido y el tamaño de los segmentos de datos, texto y bss se fijan en el momento de la compilación.
Para la pregunta n.° 3, verifique la fuente de size util en https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=binutils/size.c;h=dcfd9547b25cdd58db890f9fe0dc9a3ba9228d89;hb =CABEZA#l449 .
Muestra la adición de todas las secciones de solo lectura/código como texto. es decir
446 static void 447 berkeley_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec, 448 void *ignore ATTRIBUTE_UNUSED) 449 { 450 flagword flags; 451 bfd_size_type size; 452 453 flags = bfd_get_section_flags (abfd, sec); 454 if ((flags & SEC_ALLOC) == 0) 455 return; 456 457 size = bfd_get_section_size (sec); 458 if ((flags & SEC_CODE) != 0 || (flags & SEC_READONLY) != 0) 459 textsize += size; 460 else if ((flags & SEC_HAS_CONTENTS) != 0) 461 datasize += size; 462 else 463 bsssize += size; 464 }Entonces, si toma la salida de objdump y agrega todas las secciones de solo lectura/código, obtendrá el valor 1222