[英]How to use alternate glibc with existing libstdc++?
我需要使用glibc
(2.18)的自編譯版本,比系統上的默認版本(2.15)更新。 我可以編譯和鏈接一個C ++程序,但是當我嘗試運行它時,我得到有關libstdc++.so.6
錯誤libstdc++.so.6
。 (C程序似乎運行得很好。)我是否需要重新編譯gcc
對抗較新的glibc
才能使用? 為什么? (更新:我想出了這一部分,但我在底部還有一些其他問題。)
這是一個示例C ++程序:
#include <iostream>
int main()
{
std::cout << "ok\n";
return 0;
}
按照這個答案 ,我編譯它:
g++ -Wl,--rpath=/path/to/glibc-2.18/lib -Wl,--dynamic-linker=/path/to/glibc-2.18/lib/ld-2.18.so a.cpp
它編譯沒有錯誤,然后ldd
說:
$ ldd a.out
linux-vdso.so.1 => (0x00007fff421fe000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3b96e7f000)
libc.so.6 => /path/to/glibc-2.18/lib/libc.so.6 (0x00007f3b96ad1000)
libm.so.6 => /path/to/glibc-2.18/lib/libm.so.6 (0x00007f3b967cf000)
/path/to/glibc-2.18/lib/ld-2.18.so => /lib64/ld-linux-x86-64.so.2 (0x00007f3b9719d000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f3b965b9000)
但是當我嘗試運行它時:
$ ./a.out
./a.out: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
這很令人困惑,因為它看起來像ldd
找到libstdc++.so.6
就好了(具體版本是libstdc++.so.6.0.16
)。
更新:問題似乎(不確定)新的2.18
動態鏈接器正在使用自己的庫路徑,該路徑僅包含/path/to/glibc-2.18/lib
子文件夾。 我通過添加這個新路徑來運行程序,然后將標准路徑( /lib', '/usr/lib
等)添加到/path/to/glibc-2.18/etc/ld.so.conf
並運行/path/to/glibc-2.18/sbin/ldconfig
。 更多問題:
我是否絕對需要新的2.18
動態鏈接器來運行glibc-2.18
的程序? 標准鏈接器不能這樣做嗎? (這樣可以避免我必須設置並不斷更新2.18
動態鏈接器的路徑。)
如果我使用2.18
動態鏈接器編譯但沒有--rpath
,則程序不起作用。 為什么?
我應該在編譯命令中使用-L/path/to/glibc-2.18/lib
(除了--rpath
和--dynamic-linker
)嗎?
我是否絕對需要新的2.18動態鏈接器來運行glibc-2.18的程序?
是的(好吧,差不多。見腳注)。
這將避免我必須設置並不斷更新2.18動態鏈接器的路徑。
一種常見的技術是創建一個g++
shell包裝器,例如g++glibc2.18
,並封裝在那里添加必要的鏈接參數。 然后一個簡單的make CXX=g++glibc2.18
會做正確的事情。
標准鏈接器不能這樣做嗎?
不。請參閱此答案以獲得解釋。
如果我使用2.18動態鏈接器編譯但沒有--rpath,則程序不起作用。 為什么?
看到相同的答案。
我應該在編譯命令中使用-L / path / to / glibc-2.18 / lib(除了--rpath和--dynamic-linker)嗎?
是的,如果要使用glibc-2.18中存在但系統庫中不存在的符號。 否則,沒有。
腳注:
作為替代方案,您可以在沒有特殊標志的情況下構建程序,然后使用“顯式加載器調用”來實際運行它: /path/to/glibc-2.18/lib/ld-2.18.so /path/to/a.out
。
注意:這並不總是有效:如果程序喜歡重新exec
(以及在其他罕見的條件下)。 在以這種方式調用它時,您可能也無法調試它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.