Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

365
Vistas
size y objdump informan diferentes tamaños para el segmento de texto

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?

  1. El comando de 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?)
  2. No hay variables globales en 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 ?
  3. 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.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda