如何从 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。
您需要将该路径手动传递给链接器,或者 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 这样的奇异系统中
当我从命令行使用 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。
您需要将该路径手动传递给链接器,或者 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 这样的奇异系统中