Как бы я продублировал и переименовал символы в объектном файле? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть объектный файл (для которого у меня нет доступа к источнику).

По уважительным причинам мне нужно продублировать путь вызова.Например, этот объектный файл может иметь следующие символы:

_FuncA _FuncB _FuncC

_FuncA вызывает _FuncB, что в свою очередь вызывает _FuncC.FuncC может увеличивать глобальную переменную, определенную в исходном коде C counter.

Я хочу изменить этот объектный файл и дублировать _FuncA, _FuncB и _FuncC.

Результатом будет объектный файл со следующими символами:

_FuncA _FuncB _FuncC _FuncA_copy _FuncB_copy _FuncC_copy

_FuncA_copy потребуется вызвать _FuncB_copy, что в свою очередь вызывает _FuncC_copy.И мне нужно _FuncC_copy, чтобы по-прежнему ссылаться на такую ​​же глобальную переменную counter и увеличивать ее.

Что у меня есть:

Кажется, что команда objcopy позволит вам добавлять новые символы, используя флаг --add-symbol <name>=[<section>:]<value>[,<flags>].

Похоже, это поможет мне создать _FuncA_copy, _FuncB_copy, _FuncC_copy.Но есть ли способ изменить вызов функции внутри _FuncA_copy на _FuncB, чтобы перейти на _FuncB_copy вместо этого?

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 30 ноября 2018

Решение, которое я нашел, - написание общего модуля LLVM Pass, который может подключаться к инструменту оптимизатора LLVM, который принимает объект байт-кода и выводит объект байт-кода.

http://llvm.org/docs/WritingAnLLVMPass.html

Пропуск LLVM - это настраиваемый оптимизатор, который вы можете создать, и в нем вы можете создать цикл оптимизатора для всех символов функций и переименовать их по своему желанию, и он обновит всеиз ссылок на эту функцию.

...