我正在尝试编译支持 x32 ABI 的 Linux 6.7.2,但我不明白这意味着什么:
Symbol: X86_X32_ABI [=n]
Type : bool
Defined at arch/x86/Kconfig:3007
Prompt: x32 ABI for 64-bit mode
Depends on: X86_64 [=y] && n
Location:
(3) -> Binary Emulations
-> x32 ABI for 64-bit mode (X86_X32_ABI [=n])
我如何摆脱n
inX86_64 [=y] && n
以便它实际上让我启用此选项?
答案1
参考位置:拱门/x86/Kconfig:3007:
config X86_X32_ABI bool "x32 ABI for 64-bit mode" depends on X86_64 # llvm-objcopy does not convert x86_64 .note.gnu.property or # compressed debug sections to x86_x32 properly: # https://github.com/ClangBuiltLinux/linux/issues/514 # https://github.com/ClangBuiltLinux/linux/issues/1141 depends on $(success,$(OBJCOPY) --version | head -n1 | grep -qv llvm) help [...]
表明 objcopy 的 LLVM 变体(而不是“通常的”GNU 变体)无法正确地将某些对象从 x86_64 转换为 x86_x32。
因此添加了一个依赖于环境的测试来防止这种情况发生。
通常(GNU)objcopy
会这样开始:
$ objcopy --version | head -n1
GNU objcopy (GNU Binutils for Debian) 2.40
LLVM 开始如下:
$ llvm-objcopy --version | head -n1
llvm-objcopy, compatible with GNU objcopy
success
上面是一个宏Linux 源代码中是这样定义的:
[...]
if-success = $(shell,{ $(1); } >/dev/null 2>&1 && echo "$(2)" || echo "$(3)") # $(success,<command>) # Return y if <command> exits with 0, n otherwise success = $(if-success,$(1),y,n)
n
所有这些都是在使用 的 LLVM 变体objcopy
、失败依赖关系以及y
评估 时(当前应该意味着使用 GNU 变体)时得到的结果$(OBJCOPY) --version | head -n1 | grep -qv llvm
。
另有说明:目前使用 Clang/LLVM 编译时无法获得 x86_x32 ABI 支持:请改用 GCC。