LLD 和链接描述文件

Posted

技术标签:

【中文标题】LLD 和链接描述文件【英文标题】:LLD and the Linker Scripts 【发布时间】:2019-12-13 16:34:46 【问题描述】:

我正在尝试发送一个简单的 c 程序的链接器脚本。 我在 Ubuntu 和 Windows 上都试过了。

在 Ubuntu 上

经过一番研究,我发现它正在使用GNU-ld,所以使用clang命令行选项-fuse-ld=lld,所以现在我使用clang默认链接器lld进行链接

我试过这个命令

clang main.c -ffreestanding -nostartfiles -nodefaultlibs -fuse-ld=lld -Wl,-Map,output.map,-T Example_Linker.ld -o main

一切正常。 我得到了内存映射文件,并且还能够传递链接器脚本。

在 Windows 上

Clang 最初寻找 Microsoft Visual Studio Linker link.exe 以生成可执行文件。

它不支持链接器脚本。

所以-fuse-ld=lld

我尝试了以下命令clang main.c -ffreestanding -nostartfiles -nodefaultlibs -fuse-ld=lld -Wl,-Map,output.map,-T Example_Linker.ld -o main

所以现在抛出的错误是

clang: error: unknown argument: '-Map'
lld-link: warning: ignoring unknown argument: -T

我应该如何编写一个命令,这样我才能获得一个内存映射文件,同时我可以传递链接器脚本?

请帮助我解决问题。

【问题讨论】:

我不熟悉 Windows 上的开发,但在 Mac 上,你传递的是 -map 而不是 -Map,也许同样适用于 Windows?不过,不确定链接器脚本。 是的,当我提供 -map 时,它会提供地图文件。但是当我与 llvm 链接器 lld 链接时,似乎没有任何工作。我会收到上述错误。 【参考方案1】:

您必须使用与 Ubuntu 上相同的目标三元组。

在我的 Ubuntu clang 输出此信息:

$ clang-8 --version
clang version 8.0.0-3~ubuntu18.04.2 (tags/RELEASE_800/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

所以你会在 windows 上使用以下内容:

clang --target=x86_64-pc-linux-gnu main.c -ffreestanding -nostartfiles -nodefaultlibs -fuse-ld=lld -Wl,-Map=output.map,-T Example_Linker.ld -o main

我不能尝试这个,因为我没有链接描述文件。 您可以尝试更改目标三元组。

【讨论】:

【参考方案2】:

您在此处编写的链接器标志:

    -Wl,-Map,output.map

应该是

    -Wl,-Map=output.map

【讨论】:

我收到“警告忽略未知参数”。

以上是关于LLD 和链接描述文件的主要内容,如果未能解决你的问题,请参考以下文章

llvm linker(lld) mapfile格式说明

Zabbix实战-简易教程--低层次发现(LLD)

linux lld

Zabbix通过MegaCli实现对LSI Raid卡硬盘监控(LLD)

zabbix lld使用trapper方式(zabbix_sender)

rust-lld:错误:找不到库 -lpq