Catatan

File Shim macOS untuk Build Kernel Linux

· 1min

macOS tidak memiliki beberapa header yang dibutuhkan host tool kernel Linux. Stub berikut mengisi kekurangan tersebut supaya build tetap bisa berjalan. Pendekatannya berasal dari Building Linux Kernel on macOS Natively oleh Seiya, dan dibahas di Cara Saya Mengompilasi dan Menjalankan Kernel Linux untuk RISC-V di Mac Apple Silicon.

scripts/macos-include/elf.h

Mem-proxy macOS ke libelf dan menambahkan konstanta relocation yang hilang dari elf.h Linux.

#pragma once
#include <libelf/gelf.h>
#define STT_SPARC_REGISTER 3
#define R_386_32 1
#define R_386_PC32 2
#define R_MIPS_HI16 5
#define R_MIPS_LO16 6
#define R_MIPS_26 4
#define R_MIPS_32 2
#define R_ARM_ABS32 2
#define R_ARM_REL32 3
#define R_ARM_PC24 1
#define R_ARM_CALL 28
#define R_ARM_JUMP24 29
#define R_ARM_THM_JUMP24 30
#define R_ARM_THM_PC22 10
#define R_ARM_MOVW_ABS_NC 43
#define R_ARM_MOVT_ABS 44
#define R_ARM_THM_MOVW_ABS_NC 47
#define R_ARM_THM_MOVT_ABS 48
#define R_ARM_THM_JUMP19 51
#define R_AARCH64_ABS64 257
#define R_AARCH64_PREL64 260

scripts/macos-include/byteswap.h

Memetakan macro bswap_* Linux ke builtin clang.

#pragma once
#define bswap_16 __builtin_bswap16
#define bswap_32 __builtin_bswap32
#define bswap_64 __builtin_bswap64

scripts/macos-include/gethostuuid.h

Stub kosong. Mencegah <gethostuuid.h> macOS merujuk ke typedef uuid_t yang sudah kita blokir.

#pragma once

scripts/macos-include/fcntl.h

Mendefinisikan O_LARGEFILE yang khas Linux menjadi nol.

#pragma once
#include_next <fcntl.h>
#define O_LARGEFILE 0

scripts/macos-include/unistd.h

Mem-stub copy_file_range agar pemanggilnya beralih ke read/write biasa.

#pragma once
#include_next <unistd.h>
#include <sys/types.h>
static inline ssize_t copy_file_range(int a, void *b, int c, void *d, size_t e, unsigned int f) { return -1; }

HOSTCFLAGS

Berikan ke gmake supaya build kernel memakai shim-nya:

HOSTCFLAGS="-Iscripts/macos-include -I$(brew --prefix libelf)/include -Wno-incompatible-pointer-types -D_UUID_T"



Komentar