-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[LLD][COFF] Prevent to emit relocations for discarded weak wrapped symbols #156214
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 9 commits
992b29f
720b0cb
9b7600f
c08ec16
da17b36
6bf8c44
2c5d613
54a7109
ca3488c
ddbec97
118d330
0f2c0e2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,52 @@ | ||
| // REQUIRES: x86 | ||
|
|
||
| // Check that base-relocations for unresolved weak symbols will be omitted. | ||
|
|
||
| // RUN: rm -rf %t.dir && split-file %s %t.dir && cd %t.dir | ||
| // RUN: llvm-mc -filetype=obj -triple=x86_64-mingw main.s -o main.o | ||
| // RUN: llvm-mc -filetype=obj -triple=x86_64-mingw other.s -o other.o | ||
|
|
||
| // RUN: ld.lld -m i386pep -dll -o other.dll other.o -entry= --export-all-symbols --out-implib other.dll.a | ||
| // RUN: ld.lld -m i386pep -o main.exe main.o other.dll.a -e entry --wrap foo --verbose | ||
| // RUN: llvm-readobj --sections --symbols --coff-imports --coff-basereloc main.exe | FileCheck %s --implicit-check-not=other.dll | ||
|
|
||
| // CHECK: Number: 4 | ||
| // CHECK-NEXT: Name: .data | ||
| // CHECK-NEXT: VirtualSize: | ||
| // CHECK-NEXT: VirtualAddress: 0x[[#%x,SECTOP:0x4000]] | ||
| // CHECK: Name: ref_foo | ||
| // CHECK-NEXT: Value: [[#%d,SYMVAL:]] | ||
| // CHECK: BaseReloc [ | ||
| // CHECK-NOT: Address: 0x[[#%x,SECTOP+SYMVAL]] | ||
|
|
||
| #--- main.s | ||
| .global entry | ||
| entry: | ||
| movq ref_foo(%rip), %rax | ||
| call *%rax | ||
|
|
||
| .global __wrap_foo | ||
| __wrap_foo: | ||
| ret | ||
|
|
||
| .data | ||
| .global ref_foo | ||
| .p2align 3 | ||
| ref_foo: | ||
| .quad __real_foo | ||
|
|
||
| .globl _pei386_runtime_relocator | ||
| _pei386_runtime_relocator: | ||
| movl __RUNTIME_PSEUDO_RELOC_LIST__(%rip), %eax | ||
| movl __RUNTIME_PSEUDO_RELOC_LIST_END__(%rip), %eax | ||
|
|
||
| .weak __real_foo | ||
| .addrsig | ||
| .addrsig_sym __real_foo | ||
| .addrsig_sym ref_foo | ||
|
|
||
| #--- other.s | ||
| .global foo | ||
|
|
||
| foo: | ||
| ret | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,42 +1,59 @@ | ||
| // REQUIRES: x86 | ||
|
|
||
| // Check that we can wrap a dllimported symbol, so that references to | ||
| // __imp_<symbol> gets redirected to a defined local import instead. | ||
| // __imp_<symbol> gets redirected to a symbol already exists or a defined local import instead | ||
|
||
|
|
||
| // RUN: split-file %s %t.dir | ||
| // RUN: llvm-mc -filetype=obj -triple=i686-win32-gnu %t.dir/main.s -o %t.main.obj | ||
| // RUN: llvm-mc -filetype=obj -triple=i686-win32-gnu %t.dir/other.s -o %t.other.obj | ||
|
|
||
| // RUN: lld-link -dll -out:%t.dll %t.other.obj -noentry -safeseh:no -export:foo -implib:%t.lib | ||
| // RUN: lld-link -out:%t.exe %t.main.obj %t.lib -entry:entry -subsystem:console -debug:symtab -safeseh:no -wrap:foo -lldmap:%t.map | ||
| // RUN: lld-link -dll -out:%t.dll %t.other.obj -noentry -safeseh:no -export:foo -export:bar -implib:%t.lib | ||
| // RUN: lld-link -out:%t.exe %t.main.obj %t.lib -entry:entry -subsystem:console -debug:symtab -safeseh:no -wrap:foo -wrap:bar -lldmap:%t.map | ||
| // RUN: llvm-objdump -s -d --print-imm-hex %t.exe | FileCheck %s | ||
|
|
||
| // CHECK: Contents of section .rdata: | ||
| // CHECK-NEXT: 402000 06104000 | ||
| // CHECK-NEXT: 402000 0c104000 | ||
|
|
||
| // CHECK: Disassembly of section .text: | ||
| // CHECK-EMPTY: | ||
| // CHECK: 00401000 <_entry>: | ||
| // CHECK-NEXT: 401000: ff 25 00 20 40 00 jmpl *0x402000 | ||
| // CHECK-NEXT: 401006: ff 25 00 00 00 00 jmpl *0x0 | ||
| // CHECK-EMPTY: | ||
| // CHECK-NEXT: 00401006 <___wrap_foo>: | ||
| // CHECK-NEXT: 401006: c3 retl | ||
| // CHECK-NEXT: 0040100c <___wrap_foo>: | ||
| // CHECK-NEXT: 40100c: c3 retl | ||
| // CHECK-EMPTY: | ||
| // CHECK-NEXT: 0040100d <___wrap_bar>: | ||
| // CHECK-NEXT: 40100d: c3 retl | ||
|
|
||
| // The jmpl instruction in _entry points at an address in 0x402000, | ||
| // The first jmpl instruction in _entry points at an address in 0x402000, | ||
| // which is the first 4 bytes of the .rdata section (above), which is a | ||
| // pointer that points at ___wrap_foo. | ||
|
|
||
| // The second jmpl instruction in _entry points the null since the referenced symbol | ||
|
||
| // `__imp____wrap_bar` is declared as a weak reference to prevent pull a reference | ||
| // from an external DLL. | ||
|
|
||
| #--- main.s | ||
| .global _entry | ||
| _entry: | ||
| jmpl *__imp__foo | ||
| jmpl *__imp__bar | ||
|
|
||
| .global ___wrap_foo | ||
| ___wrap_foo: | ||
| ret | ||
|
|
||
| .weak __imp____wrap_bar | ||
| .global ___wrap_bar | ||
| ___wrap_bar: | ||
| ret | ||
|
|
||
| #--- other.s | ||
| .global _foo | ||
|
|
||
| _foo: | ||
| ret | ||
|
|
||
| .global _bar | ||
| _bar: | ||
| ret | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| ; REQUIRES: x86 | ||
|
|
||
| ; Check that 'weak' attribute will be inherited to the wrapped symbols. | ||
|
||
|
|
||
| ; RUN: llc %s -mtriple x86_64-mingw -o %t.o --filetype=obj | ||
| ; RUN: ld.lld -m i386pep -shared -o %t.dll %t.o --entry= --wrap fn | ||
|
|
||
| declare extern_weak dso_local void @__real_fn() nounwind | ||
| declare dso_local void @fn() nounwind | ||
| declare dso_local void @__wrap_fn() nounwind | ||
|
||
|
|
||
| define dllexport void @caller() nounwind { | ||
| call void @__real_fn() | ||
| call void @fn() | ||
|
||
| ret void | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We generally don't use the
ld.lldinterface inlld/test/COFF, but only use the directlld-linkinterface - even if it understandably would make more sense to use the GNU ld-like interface for being able to crosscheck things with GNU ld.