簡體   English   中英

Linux C ++可移植二進制問題

[英]Linux c++ portable binary issue

我嘗試將我的二進制文件及其所有共享庫打包到一個檔案中。 我希望用戶僅提取存檔以使二進制文件起作用。 可執行文件通過外殼腳本啟動,在該腳本中,我將LD_LIBRARY_PATH設置為存檔中包含的共享庫路徑。

第一次,我想使其在RHEL 6.7發行版上運行,因此我已使用該發行版編譯了二進制文件,並且在我對其進行測試時,它運行良好。 問題是我現在必須使其在RHEL 7.2上運行(並保持RHEL 6.7正常工作),並且當我啟動二進制文件時它不起作用...它在glibc函數內崩潰(在參數中沒有垃圾的isspace) 。 我看到這兩個RHEL版本背后的glibc版本已更改。 在檔案中包含的共享庫中,沒有glibc共享庫,因此我嘗試添加它,現在出現以下錯誤:

./XXX: ���:ELF: zR: Error 892688562

這似乎是一個ELF錯誤(每次啟動時都會出現詳細信息),我檢查了所有共享庫,它們都是x64庫(如二進制文件)...我不想在RHEL 7.2上進行編譯,因為我有很多依賴項,我不想全部編譯,也使我更容易維護一個版本。

我嘗試了很多諸如Statifier和Ermine之類的方法,它們都可以工作,但是前者有一個錯誤,必須禁用“地址空間布局隨機化”,而后者則是共享軟件,我更喜歡免費的解決方案。 我還嘗試了CDE,它也可以工作,但是它生成了這么大的包,有點混亂……

為什么使用這種解決方案有效,而使用我自己的解決方案卻無效? 我做得不好嗎?

感謝您的閱讀,我希望有人能夠為我提供解決方案,因為我搜索了很長時間...

編輯:

在我的shell腳本像這樣之前,我找到了解決方案:

# Binary location
LOCATION=$(dirname $0)
# Shared libraries directory
BINDIR=${LOCATION}/bin/
# Define LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${BINDIR}:${LD_LIBRARY_PATH}
# Launch binary
${LOCATION}/XXX $*

我改變了:

# Binary location
LOCATION=$(dirname $0)
# Shared libraries directory
BINDIR=${LOCATION}/bin/
# Changed shared library default location and launch binary
${BINDIR}/ld-linux-x86-64.so.2 --library-path ${BINDIR} ${LOCATION}/XXX $*

我不太明白為什么會這樣,但是有人可以解釋一下嗎? (ld-linux-x86-64.so.2來自RHEL 6.7發行版)

我不太明白為什么會這樣,但是有人可以解釋一下嗎?

在這里解釋。 您的解決方案是此處提到的“顯式加載程序調用”。

順便說一句,這是錯誤的: ${LOCATION}/XXX $*您應該這樣做:

${LOCATION}/XXX "$@"

(您的變體將無法正確處理帶有嵌入式空格的參數。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM