[ELF] Infer EI_OSABI from object files
The first object file whose EI_OSABI is not ELFOSABI_NONE is selected. This is useful for some OSes to identify themselves. This achieves similar effects to BFD emulations `ld.lld -m *_fbsd` but is more lightweight. Pull Request: https://github.com/llvm/llvm-project/pull/97144
This commit is contained in:
parent
fdd3196553
commit
5f1743cd07
@ -2021,16 +2021,22 @@ void LinkerDriver::inferMachineType() {
|
|||||||
if (config->ekind != ELFNoneKind)
|
if (config->ekind != ELFNoneKind)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
bool inferred = false;
|
||||||
for (InputFile *f : files) {
|
for (InputFile *f : files) {
|
||||||
if (f->ekind == ELFNoneKind)
|
if (f->ekind == ELFNoneKind)
|
||||||
continue;
|
continue;
|
||||||
config->ekind = f->ekind;
|
if (!inferred) {
|
||||||
config->emachine = f->emachine;
|
inferred = true;
|
||||||
|
config->ekind = f->ekind;
|
||||||
|
config->emachine = f->emachine;
|
||||||
|
config->mipsN32Abi = config->emachine == EM_MIPS && isMipsN32Abi(f);
|
||||||
|
}
|
||||||
config->osabi = f->osabi;
|
config->osabi = f->osabi;
|
||||||
config->mipsN32Abi = config->emachine == EM_MIPS && isMipsN32Abi(f);
|
if (f->osabi != ELFOSABI_NONE)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
error("target emulation unknown: -m or at least one .o file required");
|
if (!inferred)
|
||||||
|
error("target emulation unknown: -m or at least one .o file required");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse -z max-page-size=<value>. The default value is defined by
|
// Parse -z max-page-size=<value>. The default value is defined by
|
||||||
|
@ -1,15 +1,24 @@
|
|||||||
# REQUIRES: x86
|
# REQUIRES: x86
|
||||||
# Verify that OSABI is set to the correct value.
|
# Verify that OSABI is set to the correct value.
|
||||||
|
|
||||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-freebsd %s -o %t
|
# RUN: rm -rf %t && split-file %s %t && cd %t
|
||||||
# RUN: ld.lld %t -o %t2
|
# RUN: llvm-mc -filetype=obj -triple=x86_64 empty.s -o empty.o
|
||||||
# RUN: llvm-readobj --file-headers %t2 | FileCheck %s
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-freebsd a.s -o a.o
|
||||||
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-linux gnu.s -o gnu.o
|
||||||
|
# RUN: ld.lld a.o -o out
|
||||||
|
# RUN: llvm-readobj --file-headers out | FileCheck %s
|
||||||
|
# RUN: ld.lld empty.o a.o gnu.o empty.o -o out2
|
||||||
|
# RUN: llvm-readobj --file-headers out2 | FileCheck %s
|
||||||
|
|
||||||
|
#--- empty.s
|
||||||
|
#--- a.s
|
||||||
.globl _start
|
.globl _start
|
||||||
_start:
|
_start:
|
||||||
mov $1, %rax
|
mov $1, %rax
|
||||||
mov $42, %rdi
|
mov $42, %rdi
|
||||||
syscall
|
syscall
|
||||||
|
#--- gnu.s
|
||||||
|
.section retain,"aR"
|
||||||
|
|
||||||
# CHECK: ElfHeader {
|
# CHECK: ElfHeader {
|
||||||
# CHECK-NEXT: Ident {
|
# CHECK-NEXT: Ident {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user