Linux:控制`ld`搜索.o目标文件的位置?

sda*_*aau 6 linux search path object ld

好吧,情况就是这样:我正在尝试使用一些较旧的软件:在Ubuntu Lucid上工作正常,在Natty上失败.

所以,我strace喋喋不休,事实证明这个软件调用ld,并ld最终失败:

.../ld: crt1.o: No such file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

...是的,旧的crti.o文件丢失错误:)但是,我想用更一般的术语提问...

问题是,这是"独立"(较旧)ld,当我跑步时.../ld -verbose | less,我得到:

...
SEARCH_DIR("/usr/local/lib"); 
SEARCH_DIR("/lib"); 
SEARCH_DIR("/usr/lib");
...
Run Code Online (Sandbox Code Playgroud)

现在,问题在于:

  • 在Lucid,crt1.o是在/usr/lib/crt1.o
  • 在纳蒂,crt1.o是在/usr/lib/i386-linux-gnu/crt1.o

...所以,毫无疑问,为什么crt1.o无法找到,我想.看来,我所要做的,就是告诉ld寻找crt1.o/usr/lib/i386-linux-gnu,但我怎么做呢?

我以为我可以使用该-L选项,但是man ld说:

to link a file "hello.o":

    ld -o <output> /lib/crt0.o hello.o -lc

  This tells ld to produce a file called output as the result of linking
  the file "/lib/crt0.o" with "hello.o" and the library "libc.a", which
  will come from the standard search directories. 
...

-L searchdir
--library-path=searchdir
  Add path searchdir to the list of paths that ld will search for
  archive libraries and ld control scripts.
Run Code Online (Sandbox Code Playgroud)

......意思是' -L'会影响我们寻找的位置" libc.a"(在男人的例子中) - 但不会影响目标文件.

我实际上更喜欢这个环境变量,但我尝试了两个LD_PRELOAD_PATH并且LD_LIBRARY_PATH无济于事(我猜,那些与"共享对象"有关,而且这些.o文件不是其中之一).

有没有人知道是否有一个环境变量(最好 - 如果不是,命令行选项ld),它将控制ld搜索.o目标文件的位置?

作为一个说明,我想我可能只是符号链接/usr/lib/i386-linux-gnu/crt1.o/usr/lib/,但我宁愿使用环境变量,如果存在的话...如果没有,是否有这个任何其他可能的解决方案?

提前感谢任何答案,
干杯!

编辑:可能相关:丹尼尔凯格尔 - --with-sysroot新手麻烦:"ld:无法打开crt1.o"

sda*_*aau 7

好吧,经过一番搞砸之后,我想我设法解决了我原来的问题(尽管请注意,就原始问题而言,它仍然是与接受的答案相同的答案):

LIBRARY_PATH=/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu:$LIBRARY_PATH myprogram --args..
Run Code Online (Sandbox Code Playgroud)

这是我应该记住的区别:

  • LD_LIBRARY_PATH用于"帮助"可执行查找库文件,当它运行时(即加载LD_)
  • LIBRARY_PATH帮助gcc,g++而公司发现通过"引用的库-l"的说法(例如-ldl,也就是说libdl,这也是在我的情况的问题;看到man g++更多关于LIBRARY_PATH)

所以,因为myprogram正在调用g++,ld等等,并且那些崩溃无法在编译期间找到库 - 添加LIBRARY_PATH参数似乎已经修复了g++/ ldbehavior,因此我不会遇到问题(即使使用crt1.o!)myprogram...希望如此会持续 :)

谢谢大家的帮助,
干杯!


ric*_*vdh 5

ld根本不使用.o文件的搜索路径- 您必须将完整路径传递给它(如您从手册中引用的示例)。所以不,没有办法改变它用来查找.o文件的搜索路径。

通常,ld不应直接调用 - 例如,您通常会调用gcc来进行链接。我会说这是程序调用ld这里有问题。