簡體   English   中英

如何在現有的libstdc ++中使用替換glibc?

[英]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 更多問題:

  1. 我是否絕對需要新的2.18動態鏈接器來運行glibc-2.18的程序? 標准鏈接器不能這樣做嗎? (這樣可以避免我必須設置並不斷更新2.18動態鏈接器的路徑。)

  2. 如果我使用2.18動態鏈接器編譯但沒有--rpath ,則程序不起作用。 為什么?

  3. 我應該在編譯命令中使用-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.

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