一次失敗的嘗試,glibc2 14環境交叉編譯glibc2 12程式

一桶冷水發表於2017-12-15

開發環境是ubuntu的,發現編譯出的程式碼在centos6上不能執行,報version 'GLIBC_2.14' not found錯誤,原來是定位於穩定的centos glibc升級太慢了,ubuntu都飛到2.26了,這邊才2.12。不過因為對glibc的依賴是根據程式中所用到特性的最高版本計算的,所以實際依賴是glibc2.14,相差不遠。那麼到底是什麼特性用到了glibc2.14呢?

objdump -T app |grep GLIBC_2.14
複製程式碼

只有一個memcpy函式。google了半天,發現一個思路,能不能靜態編譯這個memcpy呢?

首先在搜尋下載glibc的靜態庫,是一個rpm包,提取出需要的libc.a,然後從靜態庫中抽取二進位制檔案

rpm2cpio glibc-static-2.25.90-2.fc27.x86_64.rpm | cpio -div
ar x ./libc.a memcpy.o
複製程式碼

結果編譯後發現什麼也沒變,還是老樣子,怎麼回事?用nm工具檢視輸出檔案的符號

nm memcpy.o
複製程式碼

空的。。。那麼memcpy跑哪裡去了呢?

nm --defined-only libc.a |grep memcpy
複製程式碼

原來被移動到memmove.o了,猜想應該是做了某些優化,儘可能用move代替copy?

然後,編譯不過。。附帶上其他依賴?編譯不過。。換用2.12以前的memcpy?編譯不過。。放棄。。。還是老老實實在目標環境編譯吧,glibc還是太底層,牽連太多。

雖然這次嘗試以失敗告終,但是也是把前幾天看的連結器,靜態庫,動態庫等相關內容都實踐了一遍。

相關文章