2010-11-12 61 views
1

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指令緩存缺失幾乎沒有)。

你用鏈接器腳本完成了哪些其他聰明的事情?

回答

2

在某個平臺上,由於我不會涉及的原因,我需要有一段可執行文件,我可以在加載後放棄。現在不幸的是,爲可執行文件取消映射的內存是不可能的,所以我不得不求助於鏈接器。

我最終做的是引入一個可執行文件的一部分,用於替換bss。這樣,假設我可以儘早偷偷摸摸一些代碼,我可以複製數據,重新初始化bss,並且只要我的別名部分小於可執行文件的總體bss,就不會爲此權限付費。有幾個問題,我根本無法真正改變crt,我可以注入代碼的最早點仍然是在初始化之後(它使用了一些bss),但沒有什麼不可能解決。

我仍然有點驚訝它的工作,我會認爲,所有的程序部分被加載後,bss被crt初始化。我沒有在任何可以訪問裝載程序或crt源代碼的平臺上嘗試過。