【问题标题】:Clever uses of linker scripts?巧妙地使用链接器脚本?
【发布时间】:2010-11-12 00:43:03
【问题描述】:

my answer describing how to use linker scripts to make a ctor-like function list 的一个很好的评论指出,最近的 GNU ld 已经大大改进了对使用-Wl,-T...INSERT BEFORE/INSERT AFTER 将新部分移植到系统链接器脚本中的支持。这让我想到了其他链接器脚本技巧。

对于网卡固件,我修改了链接描述文件以将固件的运行时模块组合在一起,以便它们都位于可以位于 L1 缓存中而不会发生冲突的连续块中。为了清理掉队者(我无法按.o 分组),我在各个函数上使用了部分属性。性能计数器验证它确实有效(将 L1 指令缓存未命中减少到几乎为零)。

您还用链接器脚本完成了哪些其他聪明的事情?

【问题讨论】:

    标签: gcc linker binutils


    【解决方案1】:

    在某个平台上,出于我不会深入讨论的原因,我需要有一段可执行文件,我可以在加载后丢弃它。现在不幸的是,无法为可执行文件取消映射内存,所以我不得不求助于链接器技巧。

    我最终做的是引入一个别名为 bss 的可执行文件部分。这样,假设我可以尽早偷偷一些代码,我可以复制数据,重新初始化 bss,只要我的别名部分小于可执行文件的总 bss,就无需为特权支付任何费用。有几个问题是我根本无法真正更改 crt,而且我可以注入代码的最早点仍然是在 tls 初始化之后(使用了一些 bss),但没有什么是不可能解决的。

    我仍然对它的工作感到惊讶,我原以为在加载所有程序部分之后,bss 是由 crt 初始化的。我没有在可以访问加载程序或 crt 源的任何平台上尝试过。

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2020-09-16
      相关资源
      最近更新 更多