2015-10-28 26 views
0

我的問題涉及我從另一家公司收到的封閉源代碼.so。不幸的是,這個.so有靜態鏈接到它的Boost1.33,並且它導出了我的應用程序想要使用的boost :: ...符號。只要使用boost :: start_thread(),就會導致SEG FAULT。Linux/C++共享庫:我可以編輯sybol表,即哪些符號被導出?

我的想法是,如果有工具可以讀取符號表,那麼可以編輯符號表(關於可見性/導出)。

那是一般可能的後期編輯嗎?是否有這樣的工具可用?如果不是,我將如何處理開發這樣的工具?

+0

readelf -Ws lib64/libvlutil.so | grep boost | grep start | grep的螺紋 提供: 1638:00000000001ee2a0 353 FUNC全局缺省12 _ZN5boost6thread12start_threadEv 5637:00000000001ee2a0 353 FUNC全局缺省12 _ZN5boost6thread12start_threadEv #################納米-GC lib64下/ libvlutil 。所以| grep boost | grep線程| grep start 交付: 00000000001ee2a0 T boost :: thread :: start_thread() – Ruben

回答

0

運行info binutils獲取一個列表。請注意,我假定你的麻煩是閉源lib(又名alienlib在這裏)有升壓例程的半缺陷副本,只有其中一些(而不是你需要的某些副本) ,所以你會遇到各種衝突。

還有...你想中性提升符號的alienlib副本,所以你可以鏈接在你自己的副本提升.so ???

你有時可以用linker script重命名符號,它可以重命名符號或列出你想要公開的符號。您「鏈接」到鏈接器腳本文件[文本文件],它是指alienlib)

有一種BFD庫(正式名稱爲「大他媽的交易」),可以讀/寫任何二進制/庫格式這是objdump的基礎。而且,他們非常重視任何

請注意,符號表位於.so文件的特定範圍內。獲得一個十六進制轉儲程序,也可以在右側掃描ascii。你將能夠得到十六進制範圍。

此外,strings程序與-t x -a,它會顯示符號的十六進制偏移量。

請注意,如果只有少數幾個,您可以使用十六進制編輯器程序手動執行此操作。請注意,有一些spiffy的,但xxd程序可以產生十六進制轉儲,它可以「破壞」一個十六進制文件回到二進制文件,所以這是一個回退。

現在你已經有了這個範圍,你可以編寫一個可以映射alienlib文件的C程序。您可以翻閱符號表範圍,查找所有「提升」字符串,只需將「提升」更改爲zoost或啓動或zcrab或任何您喜歡的相同數量的字符。需要注意的是,當我說字符串這裏我指的char str[5] = { 'b', 'o', 'o', 's', 't' };char *str = "boost";

0

objcopy把-w -L _ZN5boost * libvtutil.so
通過定位了很多提升的符號所做的更改。然而,我仍然在爲(nother?)問題而奮鬥

相關問題