2

我正在尝试为一个简单的 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 Linkerlink.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

我应该如何编写命令,以便能够获取内存映射文件并同时传递链接器脚本?

请帮助我解决问题。

4

2 回答 2

3

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

    -Wl,-Map,output.map

应该

    -Wl,-Map=output.map
于 2019-08-15T15:58:39.907 回答
0

您必须使用与 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

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

于 2021-03-22T14:00:07.833 回答