【问题标题】:How to know the supported parameter for the --oformat flag of linkers in LLVM?如何知道 LLVM 中链接器的 --oformat 标志支持的参数?
【发布时间】:2021-04-02 12:55:25
【问题描述】:

LLVM 二进制文件本质上都是交叉工具,不同的 llvm 链接器工具(例如 ld.lld.exe/ld-link.exe)只是模拟不同本机链接器(例如 GNU ld/Windows link.exe)的驱动程序。基于相同的 LLVM 链接器核心。所以每一个都应该能够为不同的目标格式生成二进制文件,比如任何主机平台上的 PE 或 ELF。

以Windows 10上的ld.lld.exe为例,

ld.lld.exe --oformat elf -o test.exe main.o

有效(test.exe 肯定不能在 Windows 上运行),但“--oformat pe”或“--oformat coff”不起作用。

我知道 ld-link 更容易生成 PE 可执行文件,但这里的目的是试验 LLVM 工具的交叉特性。

根据this,对于GNU ld,--oformat 支持的参数可以从“objdump -i”获得,因为这两个程序都是基于BFD。但是 LLVM 的 ld 工具似乎不是基于 BFD,我根据 Ubuntu 的“objdump -i”的结果尝试了“--oformat pei”和“--oformat pei-x86-64”,两者都没有不行。

如何知道每个 LLVM 链接器工具的 --oformat 标志支持哪些参数?

【问题讨论】:

    标签: linker llvm ld


    【解决方案1】:

    确实 LLVM 链接器不是那种“交叉”,例如ld.lld 只支持 ELF,它不能接受 Unix 目标文件并产生 COFF/PE。

    版本 6:

    static bool isOutputFormatBinary(opt::InputArgList &Args) {
        if (auto *Arg = Args.getLastArg(OPT_oformat)) {
            StringRef S = Arg->getValue();
            if (S == "binary")
                return true;
            error("unknown --oformat value: " + S);
        }
        return false;
    }
    

    这意味着链接器版本 6 中的 ld.lld 仅支持“--oformat binary”。

    第 9 版:

    static bool isOutputFormatBinary(opt::InputArgList &args) {
        StringRef s = args.getLastArgValue(OPT_oformat, "elf");
        if (s == "binary")
            return true;
        if (!s.startswith("elf"))
            error("unknown --oformat value: " + s);
        return false;
    }
    

    这就是链接器版本 9 中的 ld.lld 支持“--oformat binary”和“--oformat elf”的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      相关资源
      最近更新 更多