【问题标题】:What linker was used to build a Rust binary?使用什么链接器构建 Rust 二进制文件?
【发布时间】:2021-07-12 07:33:23
【问题描述】:

如果我只有二进制可执行文件,我怎么知道它是用什么链接器构建的?

【问题讨论】:

  • 为什么需要知道?通常你不能说出来。
  • 嗯,我认为这在不同的情况下可能会有用。在我的例子中,我是从一台我认为我之前设置 LLD 链接器以用于所有项目的机器上构建的,但是缓慢的构建时间让我怀疑(即使 LLD 比默认链接器,它仍然是isn't very fast,所以我不能仅仅通过构建速度来判断)。显然,就我而言,我可以在构建机器上检查它,但我认为如果有办法以某种方式检查二进制文件本身会很好。
  • 仅从链接器所做的工作来看,如果它不插入一些识别内容,我不知道如何区分链接器。 (假设使用了相同的链接器脚本。)二进制文件主要(如果不完全)是对象模块的串联,所有引用都已解析。但我不是 ELF 专家。
  • 在 linux 可执行文件中有这部分 .comment 可能有用:objdump -j .comment -s program
  • 看到这个github.com/rust-lang/rust/issues/39915,似乎还没有完全支持LLD。

标签: rust linker


【解决方案1】:

感谢罗德里戈的评论,这是一个似乎可以解决问题的解决方案:

$ objdump -j .comment -s some_app

我在 Linux 上的一个简单的 hello-world 应用程序上对其进行了测试,输出如下:

A.使用默认链接器:

$ objdump -j .comment -s target/release/my_hello_world_app

target/release/my_hello_world_app:     file format elf64-x86-64

Contents of section .comment:
 0000 4743433a 20285562 756e7475 20392e33  GCC: (Ubuntu 9.3
 0010 2e302d31 37756275 6e747531 7e32302e  .0-17ubuntu1~20.
 0020 30342920 392e332e 3000               04) 9.3.0.

B.使用 LLD 链接器:

$ objdump -j .comment -s target/release/my_hello_world_app

target/release/my_hello_world_app:     file format elf64-x86-64

Contents of section .comment:
 0000 4c696e6b 65723a20 4c4c4420 31302e30  Linker: LLD 10.0
 0010 2e300047 43433a20 28556275 6e747520  .0.GCC: (Ubuntu
 0020 392e332e 302d3137 7562756e 7475317e  9.3.0-17ubuntu1~
 0030 32302e30 34292039 2e332e30 0000      20.04) 9.3.0..

顺便说一句,我使用以下全局配置文件 ~/.cargo/config 来激活 LLD 链接器:

[build]
rustflags = [
    "-C", "link-arg=-fuse-ld=lld",
]

此设置只能在项目级别。我相信这并不重要,但我正在写这些细节,因为有些人可能会觉得它们很有用。

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 2021-11-24
    • 2021-02-20
    • 1970-01-01
    • 2020-08-26
    • 2021-01-26
    • 2011-04-18
    • 2011-02-13
    • 2020-02-26
    相关资源
    最近更新 更多