2012-03-28 21 views
9

Usando GCC, ¿cómo puedo eliminar un símbolo de un objeto compartido después de haber creado el objeto compartido? Si tengo tres archivos en C manipular símbolo foo() como:¿Cómo puedo eliminar un símbolo de un objeto compartido?

// a.c 
int foo() { return 0xdead; } 
int baz() { return 1; } 

y

// b.c 
int foo() { return 0xbeef; } 
int bar() { return 0; } 

y

// c.c 
#include "stdio.h" 
extern int foo(); 
extern int bar(); 
extern int baz(); 
int main() { printf("0x%x, 0x%x, 0x%x\n",foo(),bar(),baz()); return 0; } 

Entonces compilar y ejecutar como:

% gcc a.c --shared -fPIC -o a.so 
% gcc b.c --shared -fPIC -o b.so 
% setenv LD_LIBRARY_PATH . # export LD_LIBRARY_PATH=. for bash systems 
% gcc c.c a.so b.so -o c 
% ./c 
0xdead, 0x0, 0x1 

Cómo puedo hacerlo tan tha t a.so ya no tiene el símbolo foo() después de que haya creado a.so? Quiero el foo() definido en b.so para ser utilizado en lugar de a.soborrando el símbolo foo() de a.so. Después de foo() se suprime a.so, volver a ejecutar c debe generar una copia impresa de:

0xbeef, 0x0, 0x1 

En este ejemplo de juguete, sé que puedo simplemente volver a pedir los nombres Libary cuando compilo c.c con a.so y b.so, pero ¿cómo puede De hecho, borro el símbolo de a.so? Imagino que después de eliminar foo() de a.so, este grep de la salida nm produciría nada:

nm -a a.so | grep foo 

Mientras que en este momento se vuelve:

000000000000063c T foo 
+0

¿Por qué le dice a su GCC que compile a.so y b.so con su c.c? No se supone que las bibliotecas compartidas estén vinculadas a su binario, para eso sirve 'LD_LIBRARY_PATH'. – Eregrith

+1

¿Tal vez 'objcopy' tiene alguna funcionalidad que necesita? –

+0

¿Has mirado más completamente en 'strip'? Creo que puede apuntar a símbolos particulares en un archivo con '-R' ... – timlukins

Respuesta

11

Usted debe ser capaz de utilizar el -N (--strip-symbol) opción de objcopy para lograr lo que quiere:

$ objcopy -N foo a.so 
+0

¡Perfecto! Gracias Frederic. –

2

La visibilidad de símbolos parece ser una solución superior para seleccionar qué funciones son válidas para el enlace de tiempo de ejecución y cuáles son locales para la biblioteca pero aún "extern" declarada para permitir el uso de otros archivos .c que comprenden la biblioteca - http://gcc.gnu.org/wiki/Visibility.

Cuestiones relacionadas