簡體   English   中英

在 Linux 中使用 -fvisibility=hidden 編譯時庫加載錯誤

[英]Library load error when compiled with -fvisibility=hidden in Linux

我們面臨與 OpenSSL 靜態鏈接的共享庫的問題。 The library is used in Apache HTTP Server.Although we have compiled our shared library statically with OpenSSL, it was using system OpenSSL library path, which the web server was using for https (web server SSL). 我們可以通過設置 LD_LIBRARY_PATH 來扭轉這種行為並強制 https 使用我們的 OpenSSL 庫。 但這不是我們想要的。 We want Apache HTTP Server to use its own OpenSSL library and our SSL module (loaded on Apache) to use its own version of OpenSSL libraries. 這是我們無法實現的,因此我們遵循以下鏈接中提到的編譯器選項來控制符號的可見性,希望它可以解決問題。 (我們不做包裝共享庫)

https://wiki.openssl.org/index.php/Android#Wrapper_Shared_Objects

g++ SSlModule.cpp -fPIC -shared -I/usr/local/ssl/include -fvisibility=hidden -Wl,--exclude-libs,ALL \
-Wl,-Bstatic -lcrypto -lssl -L/usr/local/ssl/lib -o SSLModule.so -Wl,-Bdynamic

新的共享庫在啟動 Apache HTTP 服務器時給出錯誤“未定義符號 OPENSSL_sk_num”。 有人可以為我們的問題提出任何解決方案嗎?

解決方案:

Basile Starynkevitch 指出的 Drepper 的論文非常有用。 最后,我們成功編譯了靜態鏈接到 OpenSSL 的模塊

詳細說明主要步驟。

1) 使用 -Wl,-z,defs 選項。 然后它報告了許多錯誤。 因此我使用了 Makefile。 我們的模塊實際上包含的不僅僅是一個.cpp 文件

2)使用 linker 選項 --exclude-libs 並從導出中排除 libssl.a 和 libcrypto.a

3) 在 make 文件中使用 -fvisbility=hidden 標志,以便隱藏一些符號

4) 用於導出函數的已使用屬性((visibility ("default")))

5)針對OpenSSL靜態鏈接

作為一個特殊用例,我們使用了標志 RTLD_NOW| RTLD_DEEPBIND(dlopen 的第二個參數),以便我們的庫從本地 scope 讀取。 根據 Drepper 的帖子,RTLD_DEEPBIND 標志將用於罕見的用例。 因此,我們不會將其包含在面向所有客戶的通用解決方案中。

我們面臨與 OpenSSL靜態鏈接的共享庫的問題。

這個 static 鏈接到共享庫對 Linux 來說是個壞主意,無論是技術上還是法律上。 但我不是律師。 閱讀程序庫 HowTO鏈接器和加載器

由於技術原因,請了解 Linux 上的共享庫實際上需要是位置無關代碼(PIC),因為ASLR 另請參見vdso(7)execve(2)syscalls(2)credentials(7) 每個 Linux 程序除了/sbin/init (以及其他一些與systemdudevmodprobe相關的程序)都由execve啟動,它通常會運行ld.so(8)

Drepper 的論文如何編寫共享庫詳細解釋了這一點。

另請閱讀高級 Linux 編程並查看kernelnewbies.org

你的用戶也會很生氣。 使用strace(1)ltrace(1)gdb(1)來了解發生了什么。 另請參閱此報告草案(解釋有關GCC 編譯器的有趣事實)。

一些開源許可證不鼓勵 static 鏈接到共享庫。 請咨詢您的律師,也許還有FSF以及OpenSSL的版權所有者。

至少,將 OpenSSL從其源代碼重新編譯成 PIC 代碼和object 文件

注意: Android是一種 Linux 系統。 它運行Linux kernel

暫無
暫無

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

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