Как я могу удалить символ из общего объекта?

Используя GCC, как я могу удалить символ из общего объекта после того, как я создал общий объект? Если у меня есть три файла в C манипулируя символомfoo() любить:

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

а также

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

а также

// 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; }

Затем я компилирую и запускаю как:

% 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

Как я могу сделать так, чтобыa.so больше не имеет символаfoo() после того как я создалa.so? Я хочуfoo() определяется вb.so использоваться вместоa.so удаливfoo() символ изa.so, Послеfoo() удален изa.soперезапускаяc должен сгенерировать распечатку:

0xbeef, 0x0, 0x1

В этом примере с игрушкой я знаю, что могу просто переупорядочить имена библиотек при компиляцииc.c с участиемa.so а такжеb.so, но как я могу на самом деле удалить символ изa.so? Я представляю что после удаленияfoo() изa.soДостоевскийнм вывод ничего не даст:

nm -a a.so | grep foo

Тогда как сейчас это возвращает:

000000000000063c T foo

Ответы на вопрос(2)

Ваш ответ на вопрос