2010-03-09 47 views
3

我建立使用GCC 3.4.0的可執行文件。目標是嵌入式系統。我一直在使用一種模塊化的方式來定義「控制檯命令處理程序」,方法是在任何編譯單元中定義一個指向處理程序的函數指針,使其位於某個鏈接器部分。在運行時,當在控制檯上輸入一條命令時,我可以循環遍歷「控制檯處理程序數據部分」中的所有處理程序,而無需具有對每個處理程序的引用的中央表。鏈接拋出未定義的符號

聰明機靈的權利,以及現在它咬我。當我在沒有其他外部引用符號的c文件中執行此操作時(例如,我的處理程序是唯一的函數),鏈接程序將其全部拋出。我的處理程序不包含在最終的可執行文件中,編譯單元中也沒有其他任何東西。

  • 黑客是在c文件中定義一個虛擬的全局變量,並在別處引用它,然後我的處理程序在它的特殊數據部分,包括在內。
  • 我還可以用-u到鏈接器和它的作品,但吹模塊化的目標。
  • 我使用我的回調屬性((使用)),沒有運氣嘗試 - 似乎被忽略。
  • 我的特殊部分有KEEP規範,但這樣做沒有幫助。

任何想法?

感謝, 庫爾特

回答

0

除了寫一個鏈接腳本,在你擁有所有你永遠需要決定什麼被列入控制/ discared等嘗試建立以.a你的所有目標文件的並指定-whole-archive的連接,或者需要與--retain-symbols-file

+0

感謝您的回覆。不幸的是,我相信所有這些選項都需要明確命名每個函數指針,以便將它保存在二進制文件中。這就損害了模塊化的鏈接器部分的目的,否則我只會製作一箇中央表格並完成它。 我真的需要一些方法來告訴它永遠不會扔掉鏈接到某個部分的符號。 –

0

找出所有你想要的符號,並且指定其中你應該能夠明確的鏈接腳本來做到這一點。 喜歡的東西

.mysection : { 
     PROVIDE(_mysection = .); 
     KEEP (callbacks.o(.text*)) 
} 

會把.text段從callbacks.o第.mysection在 輸出文件。不過,我希望編譯器用 這個「used」屬性來做到這一點,但也許鏈接器不會得到它。如果您在LD調用看起來 (如與-v標誌GCC),並 回調目標文件得到包括有(即是它的 編譯或丟棄的連接)?

相關問題