对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
分组)我在各个函数上使用了section属性。性能计数器验证它确实有效(减少了L1指令缓存未命中几乎没有)。
您使用链接描述文件完成了哪些其他聪明的事情?
答案 0 :(得分:3)
在某个平台上,由于我不会进入的原因,我需要有一段可执行文件,我可以在加载后丢弃。现在不幸的是,为可执行文件取消映射内存是不可能的,因此我不得不诉诸链接器技巧。
我最终做的是介绍可执行文件的一部分,它将bss别名化。这样,假设我可以尽早偷偷摸摸一些代码,我可以复制数据,重新初始化bss,只要我的别名部分小于可执行文件的总bss,就不需要支付特权。有几个问题我根本无法真正改变crt,而且我可以注入代码的最早点仍然是在初始化之后(使用了一些bss),但没有什么不可能解决的。
我仍然有点惊讶它的工作原理,我会认为在所有程序部分加载后,css已经被crt初始化了。我没有在任何可以访问加载器或crt源的平台上尝试过它。