为什么 gcc 中“-l”选项的顺序很重要? [复制]

2023-12-14

我正在尝试编译一个使用udis86图书馆。实际上我正在使用中给出的示例程序用户手册图书馆的。但是编译的时候却报错。我得到的错误是:

example.c:(.text+0x7): undefined reference to 'ud_init'
example.c:(.text+0x7): undefined reference to 'ud_set_input_file'
.
.
example.c:(.text+0x7): undefined reference to 'ud_insn_asm'

我正在使用的命令是:

$ gcc -ludis86 example.c -o example 

按照用户手册中的说明。

显然,链接器无法链接 libudis 库。但如果我将命令更改为:

$ gcc example.c -ludis86 -o example 

它开始工作。那么有人可以解释一下第一个命令有什么问题吗?


因为这就是 GNU 链接器使用的链接算法的工作原理(至少在链接静态库时)。链接器是单通道链接器,一旦发现库,它就不会重新访问库。

库是目标文件的集合(存档)。当您使用添加库时-l选项,链接器不会无条件地采用all库中的目标文件。它只需要那些目标文件目前需要,即解析一些当前未解析(待处理)符号的文件。之后,链接器完全忘记了该库。

当链接器从左到右一个接一个地处理输入目标文件时,链接器会连续维护待处理符号列表。当它处理每个目标文件时,一些符号被解析并从列表中删除,其他新发现的未解析符号被添加到列表中。

因此,如果您使用以下方法包含一些库-l,链接器使用该库来解析尽可能多的当前挂起的符号,然后完全忘记该库。如果它later突然发现它现在需要来自该库的一些额外的目标文件,链接器将不会“返回”该库来检索这些额外的目标文件。已经太晚了。

因此,使用-l option late在链接器的命令行中,以便当链接器到达该位置时-l它可以可靠地确定需要哪些目标文件以及不需要哪些目标文件。放置-l选项作为链接器的第一个参数通常根本没有任何意义:在一开始,待处理符号列表是空的(或者更准确地说,由单个符号组成)main),这意味着链接器根本不会从库中获取任何内容。

在你的情况下,你的目标文件example.o包含对符号的引用ud_init, ud_set_input_file等等。链接器应该首先接收该目标文件。它将把这些交易品种添加到待处理交易品种列表中。之后您可以使用-l添加您的库的选项:-ludis86。链接器将搜索您的库并从中获取解析这些待处理符号的所有内容。

如果您将-ludis86命令行中第一个选项,链接器将有效ignore你的图书馆,因为一开始它并不知道它需要ud_init, ud_set_input_file等以后加工的时候example.o它会发现这些交易品种并将它们添加到待处理交易品种列表中。但这些符号到最后都没有得到解决,因为-ludis86已经被处理(并被有效地忽略)。

有时,当两个(或更多)库以循环方式相互引用时,甚至可能需要使用-l使用同一库两次选项,使链接器有两次机会从该库检索必要的目标文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 gcc 中“-l”选项的顺序很重要? [复制] 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • Django 1.2.4 开发服务器返回的代码 247 是什么?

    就此而言 错误代码集是否已记录 我上传大文件时收到代码 247 因此我认为这是内存问题 但找不到任何文档 您可能需要设置 FILE UPLOAD MAX MEMORY SIZE 这将强制将大于该大小的文件流式传输到磁盘 而不是允许连续消耗
  • Tweepy 多重身份验证处理程序

    我在用Tweepy 的 nirs 分叉版本 我需要用它来获取之间的推文2017 01 31 and 2017 02 01 我的代码可以工作 并且由于 Twitter 的速率限制 我必须在多个身份验证处理程序之间切换 以便能够处理日期与前面提
  • Flask-SQLAlchemy 验证:防止添加基于其他字段的关系

    我正在使用flask sqlalchemy 并尝试验证数据库的输入 对于单个字段 验证装饰器效果很好 但是 我在阻止将值添加到基于另一个字段的值的集合 关系中时遇到问题 例如 考虑以下数据模型 class MyRelation db Mod
  • Firebase 函数上显示“错误:在建立安全 TLS 连接之前客户端网络套接字已断开”

    我在用nodemailer使用我的 React js 项目的 Firebase 函数 服务器端函数 并收到错误 Error Client network socket disconnected before secure TLS conne
  • Laravel Firebase 手机号码 (OTP) 身份验证

    有没有将 Firebase 手机号码 otp 身份验证集成到 Laravel 的最佳方法 或任何包裹 您可以通过以下方式对用户进行身份验证firebase官方步骤让用户使用 OTP 验证手机号码 如果你想从服务器 Laravel 访问fir
  • System.nanoTime Javadoc 中引用的任意点是什么?

    我明白那个System nanoTime 与纪元无关 与System currentTimeMillis 尽管 从 Javadoc 中可以看出 返回的值是System nanoTime 是某个任意时间点 甚至可能是未来 的偏移量 对此 同一
  • 键盘方向和媒体查询错误(应用程序模式)

    将此网页添加到您的 iOS7 主屏幕 打开它 然后将焦点置于输入字段 弹出键盘 文字变成红色 因为手机认为它处于横向模式 有什么办法解决吗 或者我们应该责怪苹果 注意 此问题仅发生在应用程序模式下 而不是常规 Safari 浏览模式下 并且
  • 使用日期时间比较存储为字符串的日期

    我已将日期的日期存储为String在我的数据库中 格式如下 dateFormater new SimpleDateFormat dd MMM yyyy 现在我需要访问两个日期之间的数据startWeekDate and endWeekDat
  • SQL 查询 SELECT FROM [来自另一个表的列的值]

    我有一个表 X 当某些表发生更改时 触发器将在其中插入一行 我已将表名插入到表 X 中 现在 我想select表 X 中的数据inner join与实际的表格本身 是否可以使用 select 表的列中的值作为内连接的表 查询应该看起来像这样
  • 蟒蛇 | Numpy 数组图像转换

    我有一个具有形状的 Numpy 图像数组 1000 50 100 3 class numpy ndarray 其中包含 1000 个 RGB 图像 高度 50 宽度 100 通道 3 我想先转换RGB价值观YUV值并重新调整它们以获得yuv
  • 通过 Facebook SDK 3.1 支持 iOS 5 和 iOS 6

    我有一个应用程序当前支持使用旧版 Facebook SDK for iOS 通过提要对话框发布到 Facebook 更新到 iOS 版 Facebook SDK 3 1 后 我似乎可以 使用旧式 API Facebook h 实例化一个Fa
  • 使用数据从 Razor 页面重定向

    我需要通过重定向来传递集合 但 RedirectToPage 仅通过 GET 请求发送 是否有另一种方式 通过重定向发送数据 public class ListModel PageModel List
  • Android 向左滑动还是向右滑动?

    如何在 ListView 中检测到有人向左或向右滑动 You ll be wanting this excellent tutorial site died here s a new link http jsharkey org blog
  • 用于绘图的反向变换“scale()”

    我有一个以使用为中心的解释变量scale 用于预测响应变量 d lt data frame x runif 100 y rnorm 100 d lt within d s x lt scale x m1 lt lm y s x data d
  • 在 Python Django 中运行单元测试时如何禁用日志记录?

    我正在使用基于简单单元测试的测试运行器来测试我的 Django 应用程序 我的应用程序本身配置为在 settings py 中使用基本记录器 logging basicConfig level logging DEBUG 在我的应用程序代码
  • 熊猫字典到数据框 - 列乱序?

    我进行了搜索 但没有看到与这个特定问题相关的任何结果 我有一个 Python 字典 并将我的字典转换为 pandas 数据框 pandas DataFrame data dict 它可以工作 但只有一个问题 我的 pandas 数据框的列与
  • set @flag =1 和 set @@flag = 1 之间的区别

    你好 有什么区别 set flag 1 and set flag 1在 SQL Server 中 谢谢 没有什么 一些内置函数的名称以双 at 符号开头 作为一个惯例 为了避免混淆 通常建议您不要使用以 Source MSDN 使用标识符
  • 使用 Json.NET 反序列化包含数字键的 JSON

    我想将以下 JSON 使用 Json NET 反序列化为一个对象 但不能 因为类名需要以数字开头 这方面的一个例子是维基百科文章 API 使用API提供 JSON 响应会返回类似这样的内容 请注意 16689396 在 的里面 pages
  • 将 javascript 中字符串中的所有逗号分隔数字替换为点分隔数字

    假设有一个带有数字的字符串 例如 test test 12 01 test 12 4 12 3 s 2 some other text other text 2 text 我需要将带逗号的数字替换为带点的相同数字 并且不更改任何其他内容 所
  • 为什么 gcc 中“-l”选项的顺序很重要? [复制]

    这个问题在这里已经有答案了 我正在尝试编译一个使用udis86图书馆 实际上我正在使用中给出的示例程序用户手册图书馆的 但是编译的时候却报错 我得到的错误是 example c text 0x7 undefined reference to