開發環境是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還是太底層,牽連太多。
雖然這次嘗試以失敗告終,但是也是把前幾天看的連結器,靜態庫,動態庫等相關內容都實踐了一遍。