3

我正在尝试使用LLVM(来自Homebrew)构建 ELF 文件,但我不知道如何链接它。

我的文件:
multiboot2.h

struct multiboot2_header_t {
// Stub
} multiboot2_header __attribute__((section(".multiboot")));

内核.c

#include "multiboot2.h"

void _start() {
// Stub
}

链接器.ld

ENTRY(_start)

SECTIONS
{
    .text: {
    /* link the multiboot struct here */
    . = ALIGN(8);
    KEEP(*(.multiboot))
    /* place all of your code afterwards */
    *(.text)
    }
}

我可以通过命令将其编译为目标文件kernel.oclang -c -o kernel.o kernel.c --target x86_64-none-gnu ,但我无法使用我的链接器脚本链接此目标文件。

PS在我从未直接使用LLVM链接器之前,只有GNU GCC构建简单的 Linux 应用程序。

4

1 回答 1

6
clang --target=aarch64-unknown-linux-gnu -c file.c

Clang 将看到您的目标是 Linux 并发出一个 ELF 文件。o

% file file.o
file.o: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), not stripped

然后,您需要使用可以从 Homebrew 获得的ld.lld 。顺便说一句,ELF ld.lld的链接描述文件支持非常好。但是,不存在对 Mach-O ld64.lld的链接描述文件支持。

于 2020-12-25T04:31:00.523 回答