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 和链接描述文件的主要内容,如果未能解决你的问题,请参考以下文章
Zabbix通过MegaCli实现对LSI Raid卡硬盘监控(LLD)