Pregunta

He escrito una interfaz con el generador de código que me permite producir objetos compartidos. Aunque no quiero o implementar el soporte para la tabla de la sección de cabecera porque ahí es donde la complejidad mayoría de ELF restos de formato de archivo.

GNU ld utiliza encabezados de sección para enlazar con los objetos. Esto significa que cuando intento poner enlace gcc contra mi objeto compartido sin encabezados de sección, se producirá un error debido a que la LD no encuentra los símbolos, incluso si existe en la biblioteca.

¿Existe algún truco que podría utilizar para engañar al compilador para realizar la conexión tiene éxito, incluso si no encontraría ciertos símbolos?

Aquí hay algunas aclaraciones sobre el problema:

cheery@ruttunen:~/Documents/g386$ gcc dev/shared_test.c -L. -lshared -m32
/tmp/cc6qBViY.o: In function `main':
shared_test.c:(.text+0xa): undefined reference to `example_function'
collect2: ld returned 1 exit status
cheery@ruttunen:~/Documents/g386$ cat dev/shared_test.c 
// gcc shared_test.c -L. -lshared -m32
// LD_LIBRARY_PATH=. ./a.out
#include <stdio.h>

extern int example_function();

int main(){
    printf("hello %d\n", example_function());
}
cheery@ruttunen:~/Documents/g386$ readelf -D -s libshared.so 

Symbol table for image:
  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
    2   0: 00800164     0    FUNC GLOBAL DEFAULT ABS example_function
    1   0: 008000ac     0  OBJECT GLOBAL DEFAULT ABS _DYNAMIC
¿Fue útil?

Solución 2

El mejor enfoque aquí es agregar las tablas de sección requeridas por gcc. Si usted tiene una dinámica de trabajo que une el mecanismo de su generador, se requiere la misma información como lo que se inserta en las tablas de la sección.

Para la pereza me escribió un archivo de ensamblaje compartida y tira de comandos utilizadas en él para obtener un punto de referencia. 'readelf --sections' espectáculos par de secciones, pero no todos ellos necesitan. He trabajado a través de este e implementadas secciones en orden hasta que comenzó a trabajar correctamente. Esto es lo que he tenido que añadir:

cheery@ruttunen:~/Documents/g386$ readelf --sections dynamic_hello.app 
There are 5 section headers, starting at offset 0x1b9:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .shstrndx         STRTAB          00000000 000281 000024 00      0   0  1
  [ 2] .dynamic          DYNAMIC         00000000 0000b0 000050 08  WA  3   0  4
  [ 3] .dynstr           STRTAB          00000000 000158 000020 00   A  0   0  1
  [ 4] .dynsym           DYNSYM          00000000 000100 000040 10   A  3   0  4
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

No hace daño si se pone en más secciones que éstas, pero esto es suficiente para conseguir trabajo vinculación dinámica.

Otros consejos

gcc (es decir, ld detrás de gcc) tiene una opción de línea de comando que omita externos sin resolver. Eso va a suprimir el mensaje de error que se obtiene a partir de gcc. No estoy seguro de que eso va a hacer feliz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top