为方便起见,我在下面添加了相关联机帮助页.
首先我的(错误)理解:如果我需要将选项分开,
,这意味着第二个-Wl
选项不是另一个选项,因为它在,
此之前就意味着它是-rpath
选项的参数.
我不明白怎么-rpath
会有-Wl,.
争论!
在我看来有意义的是:
-Wl,-rpath .
Run Code Online (Sandbox Code Playgroud)
这应该使用当前目录参数调用-rpath链接器选项.
男人gcc:
轮候册,选项
传递选项作为链接器的选项.如果选项包含逗号,则会在逗号中将其拆分为多个选项.您可以使用此语法将参数传递给该选项.例如,
-Wl,-Map,output.map
传递-Map output.map
给链接器.使用GNU链接器时,您也可以使用`-Wl,-Map = output.map'获得相同的效果.
男子ld:
-rpath = DIR
将目录添加到运行时库搜索路径.将ELF可执行文件与共享对象链接时使用此方法.所有-rpath参数都连接在一起并传递给运行时链接程序,后者使用它们在运行时查找共享对象.在定位链接中明确包含的共享对象所需的共享对象时,也会使用-rpath选项;
我有一个运行CentOS的shell.
对于我正在做的项目,我需要python 2.5+,但centOS非常依赖于2.4.
根据我的阅读,如果你升级到2.5,很多事情都会破裂.
我想从2.4分开安装2.5,但我不知道该怎么做.到目前为止,我已经下载了源代码tarball,解压缩了它,然后做了一个./configure --prefix=/opt
我希望它最终结束的地方.我现在可以make, make install
吗?或者还有更多?
我知道可以使用readelf -d <elf> | grep RPATH
从shell检查给定的二进制文件,但是可以在一个进程中执行此操作吗?
像(我的完全系统调用):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Run Code Online (Sandbox Code Playgroud)
我正在尝试在代码库中诊断一些可疑的SO链接问题,并且如果可能的话,我希望以这种方式检查RPATH(我宁愿不必生成外部脚本).
在Windows上,我使用CodeSourcery的交叉编译器套件为ARM/Linux交叉编译程序.我使用MinGW MSYS作为我的命令解释器,并且经常会破坏我的路径和路径名.例如,为了构建我的程序,我调用了
arm-none-linux-gnueabi-gcc.exe -Wall -g \
-Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \
-Wl,-rpath=/usr/lib/myrpath \
-I../targetsysroot/usr/include \
myprogram.c -o myprogram
Run Code Online (Sandbox Code Playgroud)
当然,我想/usr/lib/myrpath
逐字插入myprogram
可执行文件 - 我正在编译的ARM Linux目标不使用MinGW或MSYS.但是这里最终会涉及到它:
...
0x0000000f (RPATH) Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...
Run Code Online (Sandbox Code Playgroud)
不完全是我想要的.如果我直接在cmd.exe命令行上调用GCC,我会在可执行文件中获得正确的rpath.如果我在MSYS命令行上调用GCC,我会得到损坏的rpath.如果我使用从cmd.exe命令行使用make运行的Makefile调用GCC,我仍然会得到一个受损的rpath(!)
我有什么想法可以关闭这种烦人的行为?
在Linux/GCC上,我可以使用-rpath标志来更改共享库的可执行文件搜索路径,而无需使用环境变量进行调整.
这可以在Windows上完成吗?据我所知,dll总是在可执行文件的目录和PATH中搜索.
我的场景:我想根据属性(32/64bit/Debug/Release)将共享库放入位置,而不需要处理唯一的名称.在Linux上,这很容易通过rpath完成,但我还没有找到任何方法在Windows上这样做.
谢谢你的任何提示!
我只是好奇.我创建了一个共享对象:
gcc -o liba.so -fPIC -shared liba.c
Run Code Online (Sandbox Code Playgroud)
还有一个共享对象,它与前者相关联:
gcc -o libb.so -fPIC -shared libb.c liba.so
Run Code Online (Sandbox Code Playgroud)
现在,在创建链接的可执行文件时libb.so
,我必须指定-rpath-link to ld,以便在发现liba.so
时可以找到它libb.so
依赖于它:
gcc -o test -Wl,-rpath-link,./ test.c libb.so
Run Code Online (Sandbox Code Playgroud)
否则ld会抱怨.
为什么,ld必须能够liba.so
在链接时找到test
?因为对我而言,似乎ld在确认liba.so
存在方面做的事情并不多.例如,根据需要readelf --dynamic ./test
只运行列表libb.so
,所以我想动态链接器必须发现libb.so -> liba.so
它自己的依赖关系,并使它自己搜索liba.so
.
我在x86-64 GNU/Linux平台上,而main() - 例程在test
调用函数libb.so
时依次调用函数liba.so
.
我只是做了使用ld的一个基本的例子-rpath
选项与$ORIGIN
这里(见一个工作版本第二反应).我试图创造一个例子main.run
链接foo.so
,进而链接bar.so
,全部采用rpath
和$ORIGIN
.
运行时文件结构是:
- 项目/
- LIB /
- DIR /
- 子/
- bar.so
- foo.so
- 跑/
- main.run(无法构建)
我正在建设foo.so使用:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/dir/foo.so obj/foo.o -Wl,-soname,foo.so -Wl,-rpath,'$ORIGIN/sub' -Llib/dir/sub -l:bar.so
Run Code Online (Sandbox Code Playgroud)
哪个建好了.ldd lib/dir/foo.so
甚至可以找到bar.so
.
但是,当我尝试链接main.run
到时foo.so
,foo.so
找不到bar.so.
我正在构建main.so使用:
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib/dir' -Llib/dir -l:foo.so
Run Code Online (Sandbox Code Playgroud)
如果foo.so
使用不递归链接的另一个版本,这可以正常工作.(取消注释make.sh中的行,在下面的项目中进行测试).
但是,使用正常foo.so
我在构建时遇到此错误main.run
:
/ usr/bin/ld:警告:bar.so,lib/dir/foo.so需要,找不到(尝试使用-rpath或-rpath-link) …
我有一个二进制"CeeloPartyServer"需要在运行时在FreeBSD机器上找到libFoundation.so.他们都在同一个目录中.我使用链接器标志"-rpath = $ ORIGIN"编译(在另一个平台上,使用交叉编译器)CeeloPartyServer.
> readelf -d CeeloPartyServer |grep -i rpath 0x0000000f (RPATH) Library rpath: [$ORIGIN] > ls CeeloPartyServer Contents Foundation.framework libFoundation.so > ./CeeloPartyServer /libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer"
当我尝试运行它时,为什么不找到库?我的确切链接器行是:-lm -lmysql -rpath = $ ORIGIN.我很确定我不必逃避\ $或类似的东西,因为我的readelf分析确实显示库rpath设置为$ ORIGIN.我错过了什么?
我正在尝试将包含特殊字符串$ ORIGIN的RPATH链接到使用GCC和Code :: Blocks IDE构建的可执行文件中.我指定了
-Wl,-R$ORIGIN
Run Code Online (Sandbox Code Playgroud)
在项目的链接器选项中,但输出到GCC的命令行是错误的(为了清楚起见剥离):
g++ -Wl,-R
Run Code Online (Sandbox Code Playgroud)
为Code :: Blocks指定此参数的正确方法是什么?
注意:现在完整的工作示例如下.原始问题如下:
我在使用ld的-rpath
参数时遇到问题$ORIGIN
.
由于我找不到一个完整的例子,我以为我会尝试自己写一个,以便我和其他人可以在以后使用它.一旦我开始工作,我会整理它.
示例项目构建一个共享库和一个链接到所述库的可执行文件.
它非常小(3个文件,22行包含buildscript).
您可以从这里下载项目
文件结构(构建前):
project/
src/
foo.cpp
main.cpp
make.sh
project/src/foo.cpp
int foo()
{ return 3; }
Run Code Online (Sandbox Code Playgroud)
project/src/main.cpp
int foo();
#include <iostream>
int main()
{
std::cout << foo() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
project/make.sh
# Make directories:
mkdir -p -v obj
mkdir -p -v lib
mkdir -p -v run
# Build the library:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/foo.sh obj/foo.o
# Build the executable: …
Run Code Online (Sandbox Code Playgroud)