2010-11-09 17 views
6

add2.c:¿Qué significa "COM" significa en la columna de la sección Ndx .symtab?

int counter=0; 
int a=0; 
int b; 
int c; 
int add(int a, int b) { 
    return a+b; 
} 

compilación: gcc -c add2.c -o add2.o

lectura de la tabla de símbolos: --symbols readelf add2.o

Symbol table '.symtab' contains 12 entries: 
    Num: Value Size Type Bind Vis  Ndx Name 
    0: 00000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 00000000  0 FILE LOCAL DEFAULT ABS add2.c 
    2: 00000000  0 SECTION LOCAL DEFAULT 1 
    3: 00000000  0 SECTION LOCAL DEFAULT 2 
    4: 00000000  0 SECTION LOCAL DEFAULT 3 
    5: 00000000  0 SECTION LOCAL DEFAULT 5 
    6: 00000000  0 SECTION LOCAL DEFAULT 4 
    7: 00000000  4 OBJECT GLOBAL DEFAULT 3 counter 
    8: 00000004  4 OBJECT GLOBAL DEFAULT 3 a 
    9: 00000004  4 OBJECT GLOBAL DEFAULT COM b 
    10: 00000004  4 OBJECT GLOBAL DEFAULT COM c 
    11: 00000000 14 FUNC GLOBAL DEFAULT 1 add 

¿Qué significa "COM" en la columna Ndx? Entiendo que "counter" y "a" se definen en la sección # 3 (es decir, .bss) y que "añadir" se define en la sección # 1 (es decir, .text), pero que estaba esperando "b" y "c" se definirá en la sección .bss también, y así obtener un "3" en la columna Ndx.

que

Respuesta

5

gcc trata globalmente sin inicializar que no están declarados explícitamente extern como símbolos "comunes" (de ahí "COM").

múltiples definiciones del mismo símbolo común (a través de múltiples archivos de objeto) se combinan juntos por el enlazador al crear el ejecutable final, de modo que todos ellos se refieren a la misma de almacenamiento. Uno de los archivos objeto puede inicializarlo a un valor particular (en cuyo caso terminará en la sección de datos); si ningún archivo de objeto lo inicializa, terminará en el BSS; si más de un objeto lo inicializa, obtendrá un error de enlazador.

En resumen, si usted tiene, digamos, dos definiciones de int a:

  • int a; en un objeto y int a; en otro objeto está bien: ambos se refieren a la misma a, inicializado a 0
  • int a; en un objeto y int a = 42; en otro objeto está bien: ambos se refieren al mismo a, inicializado a 42
  • int a = 23; en un objeto y int a= 42; en otro objeto wi Daré un error de enlace.

Tenga en cuenta que el uso de múltiples definiciones del mismo símbolo en dos objetos no está permitido técnicamente por el estándar C; pero es compatible con muchos compiladores, incluido gcc, como una extensión. (Se encuentra en "Extensiones comunes", sin juego de palabras, en la especificación C99).)

+0

Ok! Entiendo que no podemos ahora dónde un símbolo "COMÚN" terminará mirando a un archivo de objeto reubicable. Esto lo decide el vinculador, en el momento del enlace, en función de lo que otros archivos de objeto reubicables hacen con este símbolo. Es correcto ? – user368507

+0

Sí, eso es correcto. –

2

gracias desde this PDF, tabla 7-11:

SHN_COMMON
Símbolos de fi nido en relación con esta sección son símbolos comunes, tales como FORTRAN común o no asignado C variables externas. Estos símbolos son refiere a veces como provisional.

También, vea this page.

+0

El enlace a PDF ahora está muerto. –

+0

@PiotrZierhoffer: Enlace fijo. – user200783

0

Son variables globales sin inicializar que se asignan por el enlazador. Algunas veces se conocen como variables comunales.

Editar: Hrmm, Paul Baker me adelantó, con enlaces ni menos. use su respuesta :)

Cuestiones relacionadas