标签: rpath

我不明白-Wl,-rpath -Wl,

为方便起见,我在下面添加了相关联机帮助页.

首先我的(错误)理解:如果我需要将选项分开,,这意味着第二个-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选项;

gcc rpath ld

226
推荐指数
4
解决办法
17万
查看次数

在CentOS中安装python 2.6

我有一个运行CentOS的shell.

对于我正在做的项目,我需要python 2.5+,但centOS非常依赖于2.4.

根据我的阅读,如果你升级到2.5,很多事情都会破裂.

我想从2.4分开安装2.5,但我不知道该怎么做.到目前为止,我已经下载了源代码tarball,解压缩了它,然后做了一个./configure --prefix=/opt我希望它最终结束的地方.我现在可以make, make install吗?或者还有更多?

python centos rpath

85
推荐指数
7
解决办法
18万
查看次数

有没有办法检查Linux上的当前rpath?

我知道可以使用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(我宁愿不必生成外部脚本).

linux rpath

68
推荐指数
4
解决办法
6万
查看次数

如何在命令行中给出修改路径名的MinGW和MSYS

在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(!)

我有什么想法可以关闭这种烦人的行为?

gcc mingw rpath cross-compiling codesourcery

53
推荐指数
5
解决办法
2万
查看次数

是否有与-rpath链接器标志等效的Windows/MSVC?

在Linux/GCC上,我可以使用-rpath标志来更改共享库的可执行文件搜索路径,而无需使用环境变量进行调整.

这可以在Windows上完成吗?据我所知,dll总是在可执行文件的目录和PATH中搜索.

我的场景:我想根据属性(32/64bit/Debug/Release)将共享库放入位置,而不需要处理唯一的名称.在Linux上,这很容易通过rpath完成,但我还没有找到任何方法在Windows上这样做.

谢谢你的任何提示!

windows dll shared rpath

44
推荐指数
3
解决办法
9712
查看次数

为什么ld在链接可执行文件时需要-rpath-link,以便需要另一个?

我只是好奇.我创建了一个共享对象:

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.

c gcc rpath shared-libraries ld

37
推荐指数
3
解决办法
3万
查看次数

ld:在共享库中使用-rpath,$ ORIGIN(递归)

我只是做了使用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) …

linux linker shared rpath

29
推荐指数
3
解决办法
3万
查看次数

rpath = $ ORIGIN没有预期的效果?

我有一个二进制"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.我错过了什么?

linker gcc freebsd rpath

21
推荐指数
2
解决办法
1万
查看次数

如何使用$ ORIGIN获取RPATH来处理Code :: Blocks GCC?

我正在尝试将包含特殊字符串$ 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指定此参数的正确方法是什么?

linker command-line gcc rpath codeblocks

17
推荐指数
2
解决办法
7507
查看次数

构建一个简单的(hello-world-esque)示例,使用带有$ ORIGIN的ld选项-rpath

注意:现在完整的工作示例如下.原始问题如下:

我在使用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)

linux linker gcc rpath

16
推荐指数
2
解决办法
6640
查看次数