У меня проблема с g ++, он не удаляет имена моих функций, я могу открыть свою программу в (например) ida и увидеть имена всех функций, глобальных переменных и т. Д. sub_xxxxxxx)
Это мой файл компиляции.
g++ -O3 -s -Wall -fPIC -Wl,-E -masm=intel -I/usr/local/include -L/usr/local/lib -shared -o preload_new.so hook_tools.cpp SCHAR.cpp ITEM.cpp ITEM_MANAGER.cpp SCHAR_MANAGER.cpp SECTREE_MANAGER.cpp main.cpp ip_secure_main.cpp commands.cpp character_hooks.cpp costumes.cpp
Командная строка показывает, что вы компилируете общую библиотеку. Он экспортирует все функции и переменные, не объявленные как «статические», по замыслу, и это то, что требуется от создания общего объекта. Вы не можете скрыть все эти имена, не нарушая функциональность общего объекта, потому что другой объект, который загружает его, не может найти эти символы.
OTOH вы можете контролировать видимость большинства имен, используя буквально gcc видимости (-fvisibility=
) и одноименные атрибуты функции name. Их, как правило, достаточно, чтобы контролировать то, что видно в экспорте библиотеки. Ты можешь читать эта книга для подробного объяснения. (Кстати, почему вы используете -masm=intel
разве это винда?)
ОБНОВЛЕНИЕ [2013-12-27]: пример:
$ cat t1.c
int t11(void)
{ return 11; }
int t12(void) __attribute__((visibility("hidden")));
int t12(void)
{ return 12; }
$ cat t2.c
int t21(void)
{ return t11()+10; }
int t22(void)
{ return t12()+10; }
$ cat t.c
int main() {
printf("%d %d %d\n", t11(), t21(), t22());
return 0;
}
$ cat Makefile
all: t
t: libtt.so
gcc -o t t.c libtt.so -Wl,-rpath=`pwd`
libtt.so: t1.c t2.c
gcc -o libtt.so -shared t1.c t2.c -fPIC
$ nm -D libtt.so | fgrep -w T
0000000000000598 T _fini
0000000000000438 T _init
0000000000000500 T t11
0000000000000520 T t21
0000000000000540 T t22
$ ./t
12 22 23
Вы можете видеть, что библиотека создается без предупреждений о неразрешенных системах и бинарных прогонах, но t12 не экспортируется. Если закомментировать тело t12 (), сборка общей библиотеки будет успешной, но связывание исполняемого файла завершится неудачно. Если добавить результат печати t12 () в исполняемый файл, связывание также не будет выполнено.
Других решений пока нет …