forked from OSchip/llvm-project
[lld-macho] Handle multiple LC_LINKER_OPTIONs
We previously only parsed the first one. Reviewed By: #lld-macho, thakis Differential Revision: https://reviews.llvm.org/D104352
This commit is contained in:
parent
b8bbb9723a
commit
eeac6b2bec
|
@ -702,11 +702,10 @@ template <class LP> void ObjFile::parse() {
|
|||
if (!checkCompatibility(this))
|
||||
return;
|
||||
|
||||
if (const load_command *cmd = findCommand(hdr, LC_LINKER_OPTION)) {
|
||||
auto *c = reinterpret_cast<const linker_option_command *>(cmd);
|
||||
StringRef data{reinterpret_cast<const char *>(c + 1),
|
||||
c->cmdsize - sizeof(linker_option_command)};
|
||||
parseLCLinkerOption(this, c->count, data);
|
||||
for (auto *cmd : findCommands<linker_option_command>(hdr, LC_LINKER_OPTION)) {
|
||||
StringRef data{reinterpret_cast<const char *>(cmd + 1),
|
||||
cmd->cmdsize - sizeof(linker_option_command)};
|
||||
parseLCLinkerOption(this, cmd->count, data);
|
||||
}
|
||||
|
||||
ArrayRef<Section> sectionHeaders;
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
; RUN: llvm-as %t/l.ll -o %t/l.o
|
||||
;; The dynamic call to _CFBigNumGetInt128 uses dyld_stub_binder,
|
||||
;; which needs -lSystem from LC_LINKER_OPTION to get resolved.
|
||||
;; The reference to __cxa_allocate_exception will require -lc++ from
|
||||
;; LC_LINKER_OPTION to get resolved.
|
||||
; RUN: %lld %t/l.o -o %t/l -framework CoreFoundation
|
||||
; RUN: llvm-otool -l %t/l | FileCheck --check-prefix=LIB %s \
|
||||
; RUN: --implicit-check-not LC_LOAD_DYLIB
|
||||
|
@ -24,12 +26,24 @@
|
|||
; LIB: cmd LC_LOAD_DYLIB
|
||||
; LIB-NEXT: cmdsize
|
||||
; LIB-NEXT: name /usr/lib/libSystem.dylib
|
||||
; LIB: cmd LC_LOAD_DYLIB
|
||||
; LIB-NEXT: cmdsize
|
||||
; LIB-NEXT: name /usr/lib/libc++abi.dylib
|
||||
|
||||
;; Check that we don't create duplicate LC_LOAD_DYLIBs.
|
||||
; RUN: %lld -lSystem %t/l.o -o %t/l -framework CoreFoundation
|
||||
; RUN: llvm-otool -l %t/l | FileCheck --check-prefix=FRAME %s \
|
||||
; RUN: llvm-otool -l %t/l | FileCheck --check-prefix=LIB2 %s \
|
||||
; RUN: --implicit-check-not LC_LOAD_DYLIB
|
||||
;
|
||||
; LIB2: cmd LC_LOAD_DYLIB
|
||||
; LIB2-NEXT: cmdsize
|
||||
; LIB2-NEXT: name /usr/lib/libSystem.dylib
|
||||
; LIB2: cmd LC_LOAD_DYLIB
|
||||
; LIB2-NEXT: cmdsize
|
||||
; LIB2-NEXT: name /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
|
||||
; LIB2: cmd LC_LOAD_DYLIB
|
||||
; LIB2-NEXT: cmdsize
|
||||
; LIB2-NEXT: name /usr/lib/libc++abi.dylib
|
||||
|
||||
; RUN: llvm-as %t/invalid.ll -o %t/invalid.o
|
||||
; RUN: not %lld %t/invalid.o -o /dev/null 2>&1 | FileCheck --check-prefix=INVALID %s
|
||||
; INVALID: error: -why_load is not allowed in LC_LINKER_OPTION
|
||||
|
@ -53,12 +67,15 @@ target triple = "x86_64-apple-macosx10.15.0"
|
|||
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
!0 = !{!"-lSystem"}
|
||||
!llvm.linker.options = !{!0, !0}
|
||||
!1 = !{!"-lc++"}
|
||||
!llvm.linker.options = !{!0, !0, !1}
|
||||
|
||||
declare void @_CFBigNumGetInt128(...)
|
||||
declare i8* @__cxa_allocate_exception(i64)
|
||||
|
||||
define void @main() {
|
||||
call void bitcast (void (...)* @_CFBigNumGetInt128 to void ()*)()
|
||||
call i8* @__cxa_allocate_exception(i64 4)
|
||||
ret void
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue