如何从 g++ COLLECT_LTO_WRAPPER 获取信息到 make 生成的 .so 文件中?

How do I get info from g++ COLLECT_LTO_WRAPPER into a make generated .so file?

当我从命令行使用 g++ 编译一个 c++ 程序然后执行 ldd a.out ldd is 能够找到 libstdc++.a(libstdc++.so.6)

当我构建 C++ ruby 扩展时 ldd myext.so 无法 找到 libstdc++.a(libstdc++.so.6) 和 require 'myext'加载失败,抱怨找不到libstdc++。

如果我 运行 g++ -v 我看到以下输出:

COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/big_long_path....
Target: powerpc-ibm-aix7.1.0.0
Configured with: ../gcc-4.8.2/configure .....
Thread model: aix
gcc version 4.8.2 (GCC) 

现在,如果我将 LIBPATH 设置为包括 big_long_path

export LIBPATH=/big_long_path....:$LIBPATH

ldd myext.so

能够找到 libstdc++ 和我的 require 'myext' 作品(returns 真)

这可能没问题,但我不想让用户弄乱他们的 LIBPATH。有没有我可以添加到我的 Makefile 的东西,允许生成的 myext.so 在 big_long_path 指向的位置找到 libstdc++(和 libgcc),我在我看到的 COLLECT_LTO_WRAPPER 行中看到当我 运行 g++ -v ?

更新

下面接受的答案中的第一个 link 确实帮助我理解了发生了什么,并且我能够通过添加 -blibpath:big_long_path:/ 让 ldd 不抱怨 libstdc++ usr:/usr/lib 到 Makefile 中的 LDFLAGS。

但由于某些原因,当 ruby 尝试加载分机时,它仍然失败。这让我觉得 ruby 正在以某种方式调整 LIBPATH。最后,我的解决方案是将符号 link 放入 libstdc++ 并在 ruby 安装的 lib 目录中放入 libgcc_s。我的想法是 ruby 必须搜索扩展共享对象,所以我想我会利用这一点并将这两个库放在 ruby 必须搜索的路径中。我唯一想知道的是我是否应该只复制 libstdc++ 和 libgcc_s 而不是象征性地 link 它们?

看起来你构建了自己的 gcc。

This is a known issue that gcc does not pass -rpath to the linker to specify the locations of libstdc++ and libgcc_s

您需要将该路径手动传递给链接器,或者 configure your own gcc to do that for you via specs file

不要让加载程序搜索库,使用选项 -Wl,-bipath;使用 dump -X32_64 -H 检查结果;你应该看到这样的东西:

INDEX  PATH                          BASE                MEMBER              
0      /usr/local/lib:/usr/lib:/lib                                          
1      /usr/local/lib                libapr-1.so.0                           
2      /usr/local/lib                libaprutil-1.so.0                       
3      /usr/local/lib                libcrypto.so.1.0.1f                     
4      /usr/local/lib                libexpat.so.1                           
5      /usr/local/lib                libgcc_s.a          shr.o               
6      /usr/local/lib                libiconv.so.2                           
7      /usr/local/lib                libssl.so.1.0.1f                        
8      /usr/local/lib                libcpotlas.so.1                         
9      /usr/lib                      librtl.a            shr.o               
10     /usr/lib                      libc.a              shr.o               
11                                   .   

另外我不得不说使用 C++ 作为插件是一个非常糟糕的主意,尤其是在像 AIX 这样的奇异系统中