有没有针对lld的C++ API?

niwlg2el  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(148)

目前我正在为我的编程语言实现一个编译器,所以我的编译器将源文件编译成.o目标文件,由于我希望我的编程语言能够访问像printf这样的C函数,所以我需要将.o文件链接到libc
需要说明的是,在命令行中使用g++ld作为链接器可以完美地工作,但我想使用C调用LLVM链接器(lld),然而,在搜索了lld的文档后,我没有找到任何关于其C API的内容。
对于任何有使用LLVM制作编译器经验的人来说,是否有针对lld的C++ API?如果有,那么我如何使用该API?它的文档在哪里?

我不想用system()之类的东西来调用lld

gcuhipw9

gcuhipw91#

为此,必须使用llvm c++ API
首先,创建主文件:

#include <lld/Common/Driver.h>

int main() {
    std::vector<const char *> args;

    // Equivalent to calling lld from the command line
    args.push_back("ld64.lld");
    args.push_back("-dynamic");
    args.push_back("-arch");
    args.push_back("x86_64");
    args.push_back("-platform_version");
    args.push_back("macos");
    args.push_back("11.0.0");
    args.push_back("11.0.0");
    args.push_back("-syslibroot");
    args.push_back("/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk");
    args.push_back("-lSystem");
    args.push_back("/usr/local/Cellar/llvm/15.0.5/lib/clang/15.0.5/lib/darwin/libclang_rt.osx.a");
    args.push_back("test.o");

    // Replace macho with elf, mingw, wasm, or coff depending on your target system
    lld::macho::link(args, llvm::outs(), llvm::errs(), false, false);
    return 0;
}

接下来,使用以下代码进行编译:

clang++ <insert c++ file name> `llvm-config --cxxflags --ldflags --system-libs --libs core` -llldMACHO -llldCOFF -llldELF -llldCommon -llldMinGW -llldWasm -lxar

如果您想查看系统中的lld需要哪些命令和标志,一种方法是在c文件上运行clang并添加-v以查看单独的命令。

相关问题