187 lines · plain
1Make a DLL that exports a few functions, then make a DLL with PDBs that imports2them. Check that the __imp_ pointer and the generated thunks appear in the3publics stream.4 5RUN: yaml2obj %p/Inputs/export.yaml -o %t1.obj6RUN: lld-link /out:%t1.dll /dll %t1.obj /implib:%t1.lib \7RUN: /export:exportfn1 /export:exportfn28RUN: yaml2obj %p/Inputs/import.yaml -o %t2.obj9RUN: lld-link /out:%t2.exe /pdb:%t2.pdb /pdbaltpath:test.pdb \10RUN: /debug /entry:main %t2.obj %t1.lib11RUN: llvm-pdbutil dump %t2.pdb -all | FileCheck %s12 13CHECK: Streams14CHECK-NEXT: ============================================================15CHECK-LABEL: Stream 10 ( 256 bytes): [Module "Import:pdb-publics-import.test.tmp1.dll"]16 17CHECK: Module Stats18CHECK-NEXT: ============================================================19CHECK-NEXT: Mod 0000 | `{{.*}}pdb-publics-import.test.tmp2.obj`:20CHECK-NEXT: Mod 0 (debug info not present): [{{.*}}pdb-publics-import.test.tmp2.obj]21CHECK-NEXT: Mod 0001 | `pdb-publics-import.test.tmp1.dll`:22CHECK-NEXT: Mod 1 (debug info not present): [pdb-publics-import.test.tmp1.dll]23CHECK-NEXT: Mod 0002 | `Import:pdb-publics-import.test.tmp1.dll`:24CHECK-NEXT: Stream 10, 256 bytes25 26CHECK: Modules27CHECK-NEXT: ============================================================28CHECK-NEXT: Mod 0000 | `{{.*}}pdb-publics-import.test.tmp2.obj`:29CHECK-NEXT: SC[.text] | mod = 0, 0001:0000, size = 8, data crc = 0, reloc crc = 030CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |31CHECK-NEXT: IMAGE_SCN_MEM_READ32CHECK-NEXT: Obj: `{{.*}}pdb-publics-import.test.tmp2.obj`:33CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false34CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``35CHECK-NEXT: Mod 0001 | `pdb-publics-import.test.tmp1.dll`:36CHECK-NEXT: SC[???] | mod = 65535, 65535:0000, size = -1, data crc = 0, reloc crc = 037CHECK-NEXT: none38CHECK-NEXT: Obj: `{{.*}}pdb-publics-import.test.tmp1.lib`:39CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false40CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``41CHECK-NEXT: Mod 0002 | `Import:pdb-publics-import.test.tmp1.dll`:42CHECK-NEXT: SC[.text] | mod = 2, 0001:0032, size = 6, data crc = 0, reloc crc = 043CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ44CHECK-NEXT: Obj: `{{.*}}pdb-publics-import.test.tmp1.lib`:45CHECK-NEXT: debug stream: 10, # files: 0, has ec info: false46CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``47CHECK-NEXT: Mod 0003 | `* Linker *`:48CHECK-NEXT: SC[???] | mod = 65535, 65535:0000, size = -1, data crc = 0, reloc crc = 049CHECK-NEXT: none50CHECK-NEXT: Obj: ``:51CHECK-NEXT: debug stream: 11, # files: 0, has ec info: false52CHECK-NEXT: pdb file ni: 1 `{{.*}}pdb-publics-import.test.tmp2.pdb`, src file ni: 0 ``53 54CHECK: Public Symbols55CHECK-NEXT: ============================================================56CHECK-NEXT: Records57CHECK-NEXT: 112 | S_PUB32 [size = 20] `main`58CHECK-NEXT: flags = function, addr = 0001:000059CHECK-NEXT: 64 | S_PUB32 [size = 24] `exportfn1`60CHECK-NEXT: flags = function, addr = 0001:001661CHECK-NEXT: 88 | S_PUB32 [size = 24] `exportfn2`62CHECK-NEXT: flags = function, addr = 0001:003263CHECK-NEXT: 32 | S_PUB32 [size = 32] `__imp_exportfn2`64CHECK-NEXT: flags = none, addr = 0002:013665CHECK-NEXT: 0 | S_PUB32 [size = 32] `__imp_exportfn1`66CHECK-NEXT: flags = none, addr = 0002:012867 68CHECK: Symbols69CHECK-NEXT: ============================================================70CHECK-NEXT: Mod 0000 | `{{.*}}pdb-publics-import.test.tmp2.obj`:71CHECK-NEXT: Error loading module stream 0. The specified stream could not be loaded. Module stream not present72CHECK-NEXT: Mod 0001 | `pdb-publics-import.test.tmp1.dll`:73CHECK-NEXT: Error loading module stream 1. The specified stream could not be loaded. Module stream not present74CHECK-NEXT: Mod 0002 | `Import:pdb-publics-import.test.tmp1.dll`:75CHECK-NEXT: 4 | S_OBJNAME [size = 44] sig=0, `pdb-publics-import.test.tmp1.dll`76CHECK-NEXT: 48 | S_COMPILE3 [size = 40]77CHECK-NEXT: machine = intel x86-x64, Ver = LLVM Linker, language = link78CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.079CHECK-NEXT: flags = none80CHECK-NEXT: 88 | S_THUNK32 [size = 36] `exportfn1`81CHECK-NEXT: parent = 0, end = 124, next = 082CHECK-NEXT: kind = thunk, size = 6, addr = 0001:001683CHECK-NEXT: 124 | S_END [size = 4]84CHECK-NEXT: 128 | S_OBJNAME [size = 44] sig=0, `pdb-publics-import.test.tmp1.dll`85CHECK-NEXT: 172 | S_COMPILE3 [size = 40]86CHECK-NEXT: machine = intel x86-x64, Ver = LLVM Linker, language = link87CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.088CHECK-NEXT: flags = none89CHECK-NEXT: 212 | S_THUNK32 [size = 36] `exportfn2`90CHECK-NEXT: parent = 0, end = 248, next = 091CHECK-NEXT: kind = thunk, size = 6, addr = 0001:003292CHECK-NEXT: 248 | S_END [size = 4]93CHECK-NEXT: Mod 0003 | `* Linker *`:94CHECK-NEXT: 4 | S_OBJNAME [size = 20] sig=0, `* Linker *`95CHECK-NEXT: 24 | S_COMPILE3 [size = 40]96CHECK-NEXT: machine = intel x86-x64, Ver = LLVM Linker, language = link97CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.098CHECK-NEXT: flags = none99CHECK-NEXT: 64 | S_ENVBLOCK [size = {{[0-9]+}}]100CHECK: {{[0-9]+}} | S_SECTION [size = 28] `.text`101CHECK-NEXT: length = 38, alignment = 12, rva = 4096, section # = 1102CHECK-NEXT: characteristics =103CHECK-NEXT: code104CHECK-NEXT: execute permissions105CHECK-NEXT: read permissions106CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.text`107CHECK-NEXT: length = 8, addr = 0001:0000108CHECK-NEXT: characteristics =109CHECK-NEXT: code110CHECK-NEXT: execute permissions111CHECK-NEXT: read permissions112CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.rdata`113CHECK-NEXT: length = 209, alignment = 12, rva = 8192, section # = 2114CHECK-NEXT: characteristics =115CHECK-NEXT: initialized data116CHECK-NEXT: read permissions117CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$2`118CHECK-NEXT: length = 40, addr = 0002:0064119CHECK-NEXT: characteristics =120CHECK-NEXT: initialized data121CHECK-NEXT: read permissions122CHECK-NEXT: write permissions123CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$4`124CHECK-NEXT: length = 24, addr = 0002:0104125CHECK-NEXT: characteristics =126CHECK-NEXT: initialized data127CHECK-NEXT: read permissions128CHECK-NEXT: write permissions129CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$5`130CHECK-NEXT: length = 24, addr = 0002:0128131CHECK-NEXT: characteristics =132CHECK-NEXT: initialized data133CHECK-NEXT: read permissions134CHECK-NEXT: write permissions135CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$6`136CHECK-NEXT: length = 24, addr = 0002:0152137CHECK-NEXT: characteristics =138CHECK-NEXT: initialized data139CHECK-NEXT: read permissions140CHECK-NEXT: write permissions141CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$7`142CHECK-NEXT: length = 33, addr = 0002:0176143CHECK-NEXT: characteristics =144CHECK-NEXT: initialized data145CHECK-NEXT: read permissions146CHECK-NEXT: write permissions147 148CHECK: Section Contributions149CHECK-NEXT: ============================================================150 main151CHECK-NEXT: SC[.text] | mod = 0, 0001:0000, size = 8, data crc = 0, reloc crc = 0152CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |153CHECK-NEXT: IMAGE_SCN_MEM_READ154 exportfn1 thunk155CHECK-NEXT: SC[.text] | mod = 3, 0001:0016, size = 6, data crc = 0, reloc crc = 0156CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ157 exportfn2 thunk158CHECK-NEXT: SC[.text] | mod = 3, 0001:0032, size = 6, data crc = 0, reloc crc = 0159CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ160 .rdata debug directory data chunks161CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0000, size = 28, data crc = 0, reloc crc = 0162CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ163CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0028, size = 33, data crc = 0, reloc crc = 0164CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ165CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0064, size = 20, data crc = 0, reloc crc = 0166CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ167CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0084, size = 20, data crc = 0, reloc crc = 0168CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ169CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0104, size = 8, data crc = 0, reloc crc = 0170CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ171CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0112, size = 8, data crc = 0, reloc crc = 0172CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ173CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0120, size = 8, data crc = 0, reloc crc = 0174CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ175CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0128, size = 8, data crc = 0, reloc crc = 0176CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ177CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0136, size = 8, data crc = 0, reloc crc = 0178CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ179CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0144, size = 8, data crc = 0, reloc crc = 0180CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ181CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0152, size = 12, data crc = 0, reloc crc = 0182CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ183CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0164, size = 12, data crc = 0, reloc crc = 0184CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ185CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0176, size = 33, data crc = 0, reloc crc = 0186CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ187