2013-12-21 2 views
0

У меня проблема с g ++, она не разделяет имена моих функций, я могу открыть свою программу в (например) ida и увидеть имена всех функций, глобальных переменных и т. Д. Я бы как strp все из них (так что это похоже на sub_xxxxxxx)(g ++) Разбиение имен функций

Это мой файл компиляции.

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 
+0

Вы можете просто удалить имена после факта. 'man strip' – cHao

+0

@cHao Это не должно делать ничего' -s' еще не делает, если вы не ссылаетесь на некоторые конкретные варианты. – hvd

+2

Вы говорите «моя программа», но вы фактически не создаете программу, вы создаете общую библиотеку. Если вы удаляете * все * имена из общей библиотеки, как кто-нибудь сможет ее использовать? Если вы хотите удалить * некоторые * имена, это может иметь смысл, но в этом случае вам, вероятно, следует изменить свой вопрос, чтобы включить соответствующую разницу между тем, что вы делаете и не хотите экспортировать. – hvd

ответ

2

В командной строке показана компиляция разделяемой библиотеки. Он экспортирует все функции и переменные, не объявленные «статическими», по дизайну, и это то, что требуется для создания общих объектов. Вы не можете скрыть все эти имена, не нарушая функциональность общего объекта, потому что другой объект, который загружает его, не может найти эти символы.

OTOH вы можете контролировать видимость большинства имен, используя, в буквальном смысле, параметры видимости gcc (-fvisibility=) и атрибуты функции с тем же именем. Их обычно достаточно, чтобы контролировать то, что видно в экспорте библиотеки. Вы можете прочитать this book для подробного объяснения. (Кстати, почему вы используете -masm=intel, если это не Windows?)

UPDATE [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(), соединение также завершится неудачей.

+0

Это на FreeBSD, и вся библиотека просто привязана к другой программе. Так, например, Мать-программы называет character_hook_asm() из моей библиотеки (и имя остается, это нормально), но character_hook_asm() вызывает другие функции, которые используются только в этой библиотеке, могу ли я их скрыть? –

+0

@PatrykSeregiet да, пожалуйста, посмотрите пример в обновленном ответе. – Netch

Смежные вопросы