(g ++) Чередование имен функций

0

У меня проблема с g++, она не разделяет имена моих функций, я могу открыть свою программу в (например) ida и увидеть имена всех функций, глобальных переменных и т.д. Я бы хотел, чтобы strp все из них (так это похоже на 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
  • 0
    Вы можете просто лишить имена по факту. man strip
  • 0
    @cHao Это не должен делать ничего -s уже не делать, если вы не имеете в виду некоторые конкретные варианты.
Показать ещё 2 комментария
Теги:
gcc
g++
ida
strip

1 ответ

2

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

OTOH вы можете контролировать видимость большинства имен, используя, в буквальном смысле, параметры видимости gcc (-fvisibility=) и одинаковые атрибуты функции имени. Их обычно достаточно, чтобы контролировать то, что видно в экспорте библиотеки. Вы можете прочитать эту книгу для подробного объяснения. (Кстати, почему вы используете -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, и вся библиотека - это просто привязка к другой программе. Так, например, Mother-программы вызывают character_hook_asm () из моей библиотеки (и имя остается, все в порядке), но character_hook_asm () вызывает другие функции, которые используются только в этой библиотеке, могу ли я их скрыть?
  • 0
    @PatrykSeregiet да, пожалуйста, посмотрите пример в обновленном ответе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню