【问题标题】:Is it possible to develop GCC plugins for the linker?是否可以为链接器开发 GCC 插件?
【发布时间】:2020-09-16 12:05:20
【问题描述】:

我正在开发一个 GCC 插件,用于在每个函数的特定位置插入自定义汇编指令,例如在 return 语句的最开始或之前。该插件注册为在 RTL 过程中执行,原则上可以正常工作。

现在我的问题是,使用这种方法,我只能检测我有完整源代码可用的程序,即没有库,因为那些只是链接到应用程序中而不是由我编译的(这只是关于静态链接;动态链接是一个不同的主题)。

有没有办法使用自定义插件在链接器级别执行优化,类似于我在编译器级别执行的操作?我知道在链接过程中会发生某些优化,但我找不到任何关于我想要做的事情是否/如何可能的问题的资源。

谢谢!

【问题讨论】:

    标签: gcc plugins linker register-transfer-level


    【解决方案1】:

    在链接器级别优化有两种可能性:
    第一个是lto。 https://gcc.gnu.org/wiki/LinkTimeOptimization。在这种情况下,它将是一个 rtl 通道,将在一个模块上调用。
    如果您的目标支持,第二个选项是使用链接器松弛。根据放松信息,您可以插入或删除指令

    【讨论】:

    • 谢谢! -flto 已启用,但如何在链接期间注册我的插件以获得通行证?当我简单地使用 -fplugin=.. 时它不会被执行,并且 plugin_init 永远不会在这里被调用。我正在使用 riscv32-unknown-elf-gcc btw 为 RISC-V 编译。
    • 你的插件是怎么命名的?请给出确切的命令行。
    • 确切的命令是/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
    • (使用 PULP SDK 构建以便在 RISC-V PULPissimo SoC 上运行)
    • 乍一看,我没有看到任何奇怪的东西。你是如何创建你的插件的。为了测试,我创建了一个相当于 hello world 的插件,它可以与 (github.com/riscv/riscv-gnu-toolchain) 的 riscv 工具链一起正常工作,并且我看到在 lto1 之后也调用了 init 函数。
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多