Necesito vincular el programa C en un objeto compartido sin encabezados de sección
-
22-09-2019 - |
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
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.