linux – 为什么-r选项(可重定位)使ld找不到任何库?

linux – 为什么-r选项(可重定位)使ld找不到任何库?,第1张

概述使用GNU ld 2.21运行Debian / Linux x86_64. 很简单,如果我链接 ld -o main main.o /usr/lib/crti.o /usr/lib/crt1.o /usr/lib/crtn.o -lc -lm 它有效,但是当我链接时 ld -r -o main1.o main.o /usr/lib/crti.o /usr/lib/crt1.o /usr/lib/c 使用GNU ld 2.21运行Debian / Linux x86_64.

很简单,如果我链接

ld -o main main.o /usr/lib/crti.o /usr/lib/crt1.o /usr/lib/crtn.o -lc -lm

它有效,但是当我链接时

ld -r -o main1.o main.o /usr/lib/crti.o /usr/lib/crt1.o /usr/lib/crtn.o -lc -lm

它抱怨

ld: cannot find -lcld: cannot find -lm

我实际上并没有尝试以这种方式编译代码,而是我试图弄清楚为什么别人的测试看看库是否存在无效. (因此我真的不明白ld发生了什么……通常我只是用GCC来链接)

为什么告诉ld以可重定位的方式链接使它突然无法找到库?如果我只是想测试-lm存在,我还应该做些什么

ld -r -lm

这样它会找到图书馆吗?

如果你想查看我正在处理的源代码,你可以在这里下载它:https://github.com/jeremysalwen/ESPS(注意,第一次提交是原始源代码,后续提交是我个人所做的更改.)

解决方法 MacOS X.

在MacOS X上,ld的手册页非常清楚-r选项

@H_403_51@-r Merges object files to produce another mach-o object file with file type MH_OBJECT.

因此,如果您使用的是MacOS X,那么问题是-lm不是Mach-O目标文件,也不是-lc.但是,从理论上讲,如果你有对象文件main.o,obj1.o和obj2.o并且你这样做:

cp obj1.o ./-lmcp obj2.o ./-lcld -r -o main1.o main.o -lm -lc

那它可能会奏效.在实践中,它没有,并且在你得到的错误中:

ld: warning: unexpected dylib (/usr/lib/libm.dylib) on link lineld: warning: unexpected dylib (/usr/lib/libc.dylib) on link line

但是,运行:

ld -r -o main1.o -arch x86_64 main.o obj1.o obj2.o

工作没有任何来自装载机的抱怨.

linux的

在linux上,ld的手册页不那么明确,但是说:

@H_403_51@-i Perform an incremental link (same as option -r).

@H_403_51@-r
@H_403_51@--relocatable

Generate relocatable output—i.e.,generate an output file that can in turn serve as input to @H_403_51@ld. This is often called partial linking. As a sIDe effect,in environments that support standard Unix magic numbers,this option also sets the output file’s magic number to “OMAGIC”. If this option is not specifIEd,an absolute file is produced. When linking C++ programs,this option will not resolve references to constructors; to do that,use @H_403_51@-Ur.

When an input file does not have the same format as the output file,partial linking is only supported if that input file does not contain any relocations. Different output formats can have further restrictions; for example some “a.out”-based formats do not support partial linking with input files in other formats at all.

This option does the same thing as @H_403_51@-i.

在行之间读取,这也会获取目标文件并将它们转换为目标文件;它不会将库添加到组合中.如果考虑一下,就不会创建包含对库的引用的目标文件.

因此,尽管可能存在可以在使用-r选项时为链接器(加载器)指定库的平台,但还有其他不可用的平台.

解决方法

最初的问题是确定库是否存在.为什么不模仿autoconf的作用,并创建一个main.c,它优先包含对库中定义的符号的引用,但它可以简单地包含:

int main(voID){return 0;}

并编译并将其与C编译器链接:

cc -o main main.c -lm -lc

如果它不起作用,则缺少其中一个库.如果您已经检查过-lc是否存在,那么您可以推断出缺少-lm.

总结

以上是内存溢出为你收集整理的linux – 为什么-r选项(可重定位)使ld找不到任何库?全部内容,希望文章能够帮你解决linux – 为什么-r选项(可重定位)使ld找不到任何库?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1029779.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存