Можно ли разработать плагины GCC для компоновщика?

Я работаю над плагином GCC для вставки пользовательских инструкций по сборке в определенные позиции каждой функции, например. в самом начале или прямо перед операторами return. Плагин зарегистрирован для выполнения во время проходов RTL и в принципе работает нормально.

Теперь моя проблема заключается в том, что, используя этот подход, я могу только инструментировать программы, в которых у меня есть полный исходный код, то есть нет библиотек, потому что они только связаны с приложением, а не скомпилированы мной (речь идет только о статической компоновке; динамическая компоновка другая тема).

Есть ли способ выполнить оптимизацию на уровне компоновщика с помощью специального подключаемого модуля, аналогично тому, что я делаю на уровне компилятора? Я знаю, что во время связывания происходят определенные оптимизации, но я не смог найти никаких ресурсов по вопросу о том, возможно ли вообще то, что я хочу сделать.

Спасибо!


person pyXos    schedule 16.09.2020    source источник


Ответы (1)


Есть две возможности оптимизации на уровне компоновщика:
Первая — lto. https://gcc.gnu.org/wiki/LinkTimeOptimization. В этом случае это будет проход rtl, который будет вызываться для одного модуля.
Второй вариант — использовать ослабление компоновщика, если это поддерживается для вашей цели. На основе информации о релаксации вы можете вставлять или удалять инструкции

person yflelion    schedule 17.09.2020
comment
Благодарю вас! -flto уже включен, но как мне зарегистрировать свой плагин для прохода при линковке? Он не выполняется, когда я просто использую -fplugin=.. и plugin_init здесь никогда не вызывается. Я компилирую для RISC-V с помощью riscv32-unknown-elf-gcc, кстати. - person pyXos; 18.09.2020
comment
как ты назвал свой плагин? не могли бы вы дать точную командную строку, пожалуйста. - person yflelion; 18.09.2020
comment
Точная команда /opt/riscv/bin/riscv32-unknown-elf-gcc -march=rv32imfcxpulpv2 -mfdiv -D__riscv__ -MMD -MP -flto -O -g -fplugin=gcc_plugin.so -o <out path> <list of object files> -nostartfiles -nostdlib -Wl,--gc-sections -L/<path>/rules -Tpulpissimo/link.ld -L/<path>/pulpissimo -L/<path>/pulpissimo_genesys2 -lrt -lrtio -lrt -lgcc - person pyXos; 21.09.2020
comment
(Сборка с помощью PULP SDK для работы на RISC-V PULPissimo SoC) - person pyXos; 21.09.2020
comment
На первый взгляд ничего странного не вижу. Как вы создали свой плагин. Для тестирования я создал плагин, эквивалентный hello world, он отлично работает с цепочкой инструментов riscv из (github.com/riscv/riscv-gnu-toolchain), и я вижу, что функция инициализации также вызывается после lto1. - person yflelion; 21.09.2020
comment
Мне не хватало -flto при компиляции объектных файлов, я добавил его только на последнем шаге. Это работает сейчас! - person pyXos; 21.09.2020