Utilizzo di GCC, come è possibile rimuovere un simbolo da un oggetto condiviso dopo aver creato l'oggetto condiviso? Se ho tre file in C manipolare simbolo foo()
come:Come posso rimuovere un simbolo da un oggetto condiviso?
// a.c
int foo() { return 0xdead; }
int baz() { return 1; }
e
// b.c
int foo() { return 0xbeef; }
int bar() { return 0; }
e
// 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; }
Poi ho compilare ed eseguire come:
% 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
Come posso farcela così t a.so
non ha più il simbolo foo()
dopo aver creato a.so
? Voglio il foo()
definito in b.so
da utilizzare invece di a.so
eliminando il simbolo foo()
da a.so
. Dopo foo()
viene eliminato dal a.so
, eseguire nuovamente c
dovrebbe generare una stampa di:
0xbeef, 0x0, 0x1
In questo esempio giocattolo, so che posso semplicemente ri-ordinare i nomi libary Quando compilo c.c
con a.so
e b.so
, ma come può In realtà cancello il simbolo da a.so
? Immagino che dopo l'eliminazione foo()
da a.so
, questo grep del nm uscita produrrebbe nulla:
nm -a a.so | grep foo
Mentre adesso ritorna:
000000000000063c T foo
Perché dici al tuo GCC di compilare a.so e b.so con il tuo c.c? Le librerie condivise non dovrebbero essere collegate al tuo binario, ecco a cosa serve 'LD_LIBRARY_PATH'. – Eregrith
Forse 'objcopy' ha alcune funzionalità di cui hai bisogno? –
Hai guardato più a fondo su 'strip'? Credo che tu possa indirizzare particolari simboli in un file con '-R' ... – timlukins