2012-04-14 42 views
7

我知道在過去有一個選項-fprefix-function-name會爲所有生成的符號添加前綴,它似乎不再是gcc的一部分。有沒有其他方法可以做到這一點?如何讓gcc爲所有符號名稱添加前綴

+5

爲什麼你需要這樣做?也許使用命名空間會解決你的問題嗎? – 2012-04-14 22:06:36

+0

我正在編譯我從別人處獲得的代碼。代碼是多線程的,它試圖使用一箇舊的,非線程安全的C庫。編寫該應用程序的人找到的解決方案是擁有C庫的多個副本,每個副本都具有與其符號名稱不同的前綴。然後,該應用程序的每個線程都會調用該函數的不同版本。因此,例如,如果舊庫具有funcion oldlib_func,則會有版本v1_oldlib_func,v2_oldlib_func,以便線程號1將調用v1_oldlib_func,線程號2將調用v2_oldlib_func。 – user1333800 2012-04-14 22:31:17

+0

編寫應用程序的人必須使用這些前綴創建舊庫的這些不同版本,事情是我沒有得到那部分代碼,所以我必須採取原始庫代碼並找到一種方法來添加前綴到符號名稱。 – user1333800 2012-04-14 22:31:40

回答

11

我相信this answer會給你解決方案。

總之,你可以在現有庫 '前綴' 符號使用objcopy這樣的:

objcopy把--prefix符號= foo_ foo.o的

3

*編輯:George Skoptsov's solution「比我的更好:)然而nm技巧可能會派上用場。


這不正是你所尋找的東西,但我不得不這樣做,在過去(重命名由庫導出的符號)

如果你知道這些符號的名稱類似的東西你想重新定義你可以嘗試使用objcopy --redefine-syms old=new。見objcopy把對輸入的詳細信息的手冊頁(objcopy命令可能會覆蓋您的文件,所以要小心這一點)

如果你不知道你可以使用nm得到符號列表嘗試的符號的名稱。再一次,因爲我不確定你正在尋找什麼樣的符號,手冊頁可能是你最好的選擇。

+1

我「愛」一個叫做objcopy的命令實際上不會生成一個副本。 – Puppy 2012-04-14 22:49:32

+1

@DeadMG:它*可以*生成一個副本(並且在內部),但是明顯的修改是非常有用的功能,不會添加它。 :) – ams 2012-04-16 12:50:20

相關問題