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

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

简介

在编程和计算机科学的世界里,有不同的技术和工具用来解决各种问题。程序员经常遇到的问题之一是链接错误。当一个程序被编译和链接时,它必须找到必要的库才能发挥作用。然而,有时链接器无法找到所需的库,从而导致链接错误。在这篇文章中,我们将讨论为什么-r选项(relocatable)会使ld找不到任何库,并提供例子。

什么是-r选项

选项指定链接器的输出应该是一个可重定位的对象文件,这是一个可以进一步链接以创建一个可执行文件或共享对象文件的文件。-r选项通常在连接对象文件以创建一个静态库时使用。当使用-r选项时,链接器不会解析对象文件中所有未定义的符号,输出是一个可重定位的对象文件,可以在以后用于进一步链接。

为什么 -r 选项使 ld 找不到任何库

当使用-r选项时,ld不会寻找任何库,因为它假定所有必要的符号都在输入的对象文件中定义。这意味着,如果有任何未定义的符号,ld将无法在任何库中找到它们,从而导致链接错误。

例子

为了更好地理解为什么-r选项使ld找不到任何库,让我们考虑一个例子。假设我们有两个对象文件,a.o和b.o,我们想把它们连接起来创建一个静态库。两个对象文件包含一些需要解决的未定义符号。

如果我们使用以下命令来链接对象文件 −

$ ld -r a.o b.o -o libab.o

输出将是一个可重定位的对象文件,libab.o,以后可以用来进一步链接。然而,如果我们试图链接libab.o以创建一个可执行文件,我们将得到一个链接错误,因为对象文件中未定义的符号没有被解决。

$ ld libab.o -o myprog

未定义的符号。_foo _bar

在这种情况下,ld没有找到任何包含符号_foo和_bar的库,导致链接错误。

解决方法

为了解决由-r选项引起的链接错误,我们需要明确地链接必要的库。这意味着我们需要使用-l选项来指定包含未定义符号的库。

例如,如果我们的对象文件中未定义的符号被定义在libmylib.a库中,我们可以将我们的对象文件和库连接起来,如下所示

$ ld -r a.o b.o -lmylib -o libab.o

这将链接对象文件和库,以创建一个可重定位的对象文件,libab.o,以后可用于进一步链接。

其他信息

在创建静态库时,-r选项很有用,因为它允许我们创建一个中间的对象文件,可以用来创建多个静态库。这可以节省时间并减少冗余,因为我们不必在每次要创建静态库时重新编译对象文件。

-r选项也可以用来创建一个可重定位的共享库。一个共享库是一个在运行时被加载到内存中的库,可以被多个程序共享。在创建共享库时,我们可以使用-r选项来创建一个中间可重定位的对象文件,该文件可以与其他对象文件和共享库连接,从而创建一个共享库。

需要注意的是,-r选项并不能阻止ld在创建可执行文件或共享库时搜索库。选项只影响链接器在创建可重定位对象文件时的行为。

结论

总之,-r选项使ld找不到任何库,因为它假定所有必要的符号都在输入对象文件中定义。如果有任何未定义的符号没有在输入文件中定义,这可能导致链接错误。为了解决链接错误,我们需要使用-l选项明确地链接必要的库。了解-r选项是如何工作的,以及如何解决由该选项引起的链接错误,对于想要创建静态库和可执行文件的程序员来说非常重要。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Linux 基础