Created
July 27, 2025 13:55
-
-
Save kikairoya/229ec2ff83637f6742e6c0da07749bb3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// RUN: rm -rf %t && split-file %s %t | |
// RUN: llvm-mc -filetype=obj -triple=x86_64-w64-mingw32 %t/lib.s -o %t/lib.o | |
// RUN: ld.bfd -m i386pep %t/lib.o --dll -o %t/lib.dll --out-implib %t/lib.dll.a @%t/wrap.rsp --entry _dllmain --export-all-symbols | |
// RUN: llvm-mc -filetype=obj -triple=x86_64-w64-mingw32 %t/main.s -o %t/main.o | |
// RUN: llvm-mc -filetype=obj -triple=x86_64-w64-mingw32 %t/table.s -o %t/table.o | |
// RUN: llvm-mc -filetype=obj -triple=x86_64-w64-mingw32 %t/override.s -o %t/override.o | |
// RUN: ld.bfd -m i386pep %t/main.o %t/table.o %t/override.o %t/lib.dll.a -o %t/bfd_imp.exe @%t/wrap.rsp | |
// RUN: llvm-readobj --coff-imports --coff-basereloc %t/bfd_imp.exe | FileCheck %s | |
// RUN: %t/bfd_imp.exe | |
// RUN: ld.bfd -m i386pep %t/main.o %t/table.o %t/override.o %t/lib.dll -o %t/bfd_dll.exe @%t/wrap.rsp | |
// RUN: llvm-readobj --coff-imports --coff-basereloc %t/bfd_dll.exe | FileCheck %s | |
// RUN: %t/bfd_dll.exe | |
// RUN: ld.lld -m i386pep %t/main.o %t/table.o %t/override.o %t/lib.dll.a -o %t/lld_imp.exe @%t/wrap.rsp --verbose | |
// RUN: llvm-readobj --coff-imports --coff-basereloc %t/lld_imp.exe | FileCheck %s | |
// RUN: %t/lld_imp.exe | |
// RUN: ld.lld -m i386pep %t/main.o %t/table.o %t/override.o %t/lib.dll -o %t/lld_dll.exe @%t/wrap.rsp --verbose | |
// RUN: llvm-readobj --coff-imports --coff-basereloc %t/lld_dll.exe | FileCheck %s | |
// RUN: %t/lld_dll.exe | |
// CHECK: Import | |
// CHECK-NEXT: Name: lib.dll | |
// CHECK-NEXT: ImportLookupTableRVA | |
// CHECK-NEXT: ImportAddressTableRVA | |
// CHECK-NEXT: Symbol: strong_real | |
// CHECK-NEXT: Symbol: strong_wrap | |
// CHECK-NEXT: } | |
// CHECK: BaseReloc | |
// CHECK-NOT: 0x1100 | |
// CHECK-NOT: 0x1110 | |
// CHECK-NOT: 0x1120 | |
// CHECK-NOT: 0x1130 | |
// CHECK: ] | |
//--- wrap.rsp | |
--entry _start | |
--image-base 0x200000 | |
--dynamicbase | |
--wrap weak_wrap | |
--wrap strong_wrap | |
--wrap undef_wrap | |
--wrap weak_hide | |
--wrap strong_hide | |
--wrap unused | |
--wrap alone | |
//--- main.s | |
.text | |
.globl _start | |
.align 16 | |
_start: | |
movq ref_weak_wrap(%rip), %rcx | |
movq ref_weak_real(%rip), %rdx | |
add %rcx, %rdx | |
movq ref_undef_wrap(%rip), %rcx | |
movq ref_undef_real(%rip), %rax | |
add %rcx, %rdx | |
add %rax, %rdx | |
setne %dl // ret = (ref_weak_wrap + ...) != 0 | |
xor %rcx, %rcx | |
dec %rcx | |
mov %rcx, %r10 | |
mov $0x2C, %eax | |
syscall // ExitProcess(-1, ret) | |
jmp . | |
.globl _pei386_runtime_relocator | |
.align 16 | |
_pei386_runtime_relocator: | |
ret | |
//--- table.s | |
.text | |
.align 256 | |
.globl ref_weak_wrap | |
ref_weak_wrap: | |
.quad __real_weak_wrap | |
.weak __real_weak_wrap | |
.globl ref_strong_wrap | |
ref_strong_wrap: | |
.quad __real_strong_wrap | |
.globl ref_undef_wrap | |
ref_undef_wrap: | |
.quad __real_undef_wrap | |
.weak __real_undef_wrap | |
.globl ref_weak_hide | |
ref_weak_hide: | |
.quad __real_weak_hide | |
.weak __real_weak_hide | |
.globl ref_weak_real | |
ref_weak_real: | |
.quad weak_real | |
.weak weak_real | |
.globl ref_strong_real | |
ref_strong_real: | |
.quad strong_real | |
.globl ref_undef_real | |
ref_undef_real: | |
.quad undef_real | |
.weak undef_real | |
.globl ref_strong_hide | |
ref_strong_hide: | |
.quad __real_strong_hide | |
//--- override.s | |
.globl weak_hide | |
.align 16 | |
weak_hide: | |
ret | |
.globl strong_hide | |
.align 16 | |
strong_hide: | |
ret | |
.globl alone | |
.align 16 | |
alone: | |
ret | |
//--- lib.s | |
.globl _dllmain | |
_dllmain: | |
xor %rax, %rax | |
inc %rax | |
ret | |
.globl weak_wrap | |
weak_wrap: | |
ret | |
.globl strong_wrap | |
strong_wrap: | |
ret | |
.globl weak_real | |
weak_real: | |
ret | |
.globl strong_real | |
strong_real: | |
ret | |
.globl weak_hide | |
weak_hide: | |
ret | |
.globl strong_hide | |
strong_hide: | |
ret | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment