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.so
borrando 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
¿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
¿Tal vez 'objcopy' tiene alguna funcionalidad que necesita? –
¿Has mirado más completamente en 'strip'? Creo que puede apuntar a símbolos particulares en un archivo con '-R' ... – timlukins