1Make a DLL that exports a few functions, then make a DLL with PDBs that imports 2them. Check that the __imp_ pointer and the generated thunks appear in the 3publics stream. 4 5RUN: yaml2obj %p/Inputs/export.yaml -o %t1.obj 6RUN: lld-link /out:%t1.dll /dll %t1.obj /implib:%t1.lib \ 7RUN: /export:exportfn1 /export:exportfn2 8RUN: yaml2obj %p/Inputs/import.yaml -o %t2.obj 9RUN: lld-link /out:%t2.exe /pdb:%t2.pdb /pdbaltpath:test.pdb \ 10RUN: /debug /entry:main %t2.obj %t1.lib 11RUN: llvm-pdbutil dump %t2.pdb -all | FileCheck %s 12 13CHECK: Streams 14CHECK-NEXT: ============================================================ 15CHECK-LABEL: Stream 10 ( 256 bytes): [Module "Import:pdb-publics-import.test.tmp1.dll"] 16 17CHECK: Module Stats 18CHECK-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 bytes 25 26CHECK: Modules 27CHECK-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 = 0 30CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE | 31CHECK-NEXT: IMAGE_SCN_MEM_READ 32CHECK-NEXT: Obj: `{{.*}}pdb-publics-import.test.tmp2.obj`: 33CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false 34CHECK-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 = 0 37CHECK-NEXT: none 38CHECK-NEXT: Obj: `{{.*}}pdb-publics-import.test.tmp1.lib`: 39CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false 40CHECK-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 = 0 43CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ 44CHECK-NEXT: Obj: `{{.*}}pdb-publics-import.test.tmp1.lib`: 45CHECK-NEXT: debug stream: 10, # files: 0, has ec info: false 46CHECK-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 = 0 49CHECK-NEXT: none 50CHECK-NEXT: Obj: ``: 51CHECK-NEXT: debug stream: 11, # files: 0, has ec info: false 52CHECK-NEXT: pdb file ni: 1 `{{.*}}pdb-publics-import.test.tmp2.pdb`, src file ni: 0 `` 53 54CHECK: Public Symbols 55CHECK-NEXT: ============================================================ 56CHECK-NEXT: Records 57CHECK-NEXT: 112 | S_PUB32 [size = 20] `main` 58CHECK-NEXT: flags = function, addr = 0001:0000 59CHECK-NEXT: 64 | S_PUB32 [size = 24] `exportfn1` 60CHECK-NEXT: flags = function, addr = 0001:0016 61CHECK-NEXT: 88 | S_PUB32 [size = 24] `exportfn2` 62CHECK-NEXT: flags = function, addr = 0001:0032 63CHECK-NEXT: 32 | S_PUB32 [size = 32] `__imp_exportfn2` 64CHECK-NEXT: flags = none, addr = 0002:0136 65CHECK-NEXT: 0 | S_PUB32 [size = 32] `__imp_exportfn1` 66CHECK-NEXT: flags = none, addr = 0002:0128 67 68CHECK: Symbols 69CHECK-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 present 72CHECK-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 present 74CHECK-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 = link 78CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0 79CHECK-NEXT: flags = none 80CHECK-NEXT: 88 | S_THUNK32 [size = 36] `exportfn1` 81CHECK-NEXT: parent = 0, end = 124, next = 0 82CHECK-NEXT: kind = thunk, size = 6, addr = 0001:0016 83CHECK-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 = link 87CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0 88CHECK-NEXT: flags = none 89CHECK-NEXT: 212 | S_THUNK32 [size = 36] `exportfn2` 90CHECK-NEXT: parent = 0, end = 248, next = 0 91CHECK-NEXT: kind = thunk, size = 6, addr = 0001:0032 92CHECK-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 = link 97CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0 98CHECK-NEXT: flags = none 99CHECK-NEXT: 64 | S_ENVBLOCK [size = {{[0-9]+}}] 100CHECK: {{[0-9]+}} | S_SECTION [size = 28] `.text` 101CHECK-NEXT: length = 38, alignment = 12, rva = 4096, section # = 1 102CHECK-NEXT: characteristics = 103CHECK-NEXT: code 104CHECK-NEXT: execute permissions 105CHECK-NEXT: read permissions 106CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.text` 107CHECK-NEXT: length = 8, addr = 0001:0000 108CHECK-NEXT: characteristics = 109CHECK-NEXT: code 110CHECK-NEXT: execute permissions 111CHECK-NEXT: read permissions 112CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.rdata` 113CHECK-NEXT: length = 209, alignment = 12, rva = 8192, section # = 2 114CHECK-NEXT: characteristics = 115CHECK-NEXT: initialized data 116CHECK-NEXT: read permissions 117CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$2` 118CHECK-NEXT: length = 40, addr = 0002:0061 119CHECK-NEXT: characteristics = 120CHECK-NEXT: initialized data 121CHECK-NEXT: read permissions 122CHECK-NEXT: write permissions 123CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$4` 124CHECK-NEXT: length = 24, addr = 0002:0104 125CHECK-NEXT: characteristics = 126CHECK-NEXT: initialized data 127CHECK-NEXT: read permissions 128CHECK-NEXT: write permissions 129CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$5` 130CHECK-NEXT: length = 24, addr = 0002:0128 131CHECK-NEXT: characteristics = 132CHECK-NEXT: initialized data 133CHECK-NEXT: read permissions 134CHECK-NEXT: write permissions 135CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$6` 136CHECK-NEXT: length = 24, addr = 0002:0152 137CHECK-NEXT: characteristics = 138CHECK-NEXT: initialized data 139CHECK-NEXT: read permissions 140CHECK-NEXT: write permissions 141CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$7` 142CHECK-NEXT: length = 33, addr = 0002:0176 143CHECK-NEXT: characteristics = 144CHECK-NEXT: initialized data 145CHECK-NEXT: read permissions 146CHECK-NEXT: write permissions 147 148CHECK: Section Contributions 149CHECK-NEXT: ============================================================ 150 main 151CHECK-NEXT: SC[.text] | mod = 0, 0001:0000, size = 8, data crc = 0, reloc crc = 0 152CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE | 153CHECK-NEXT: IMAGE_SCN_MEM_READ 154 exportfn1 thunk 155CHECK-NEXT: SC[.text] | mod = 3, 0001:0016, size = 6, data crc = 0, reloc crc = 0 156CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ 157 exportfn2 thunk 158CHECK-NEXT: SC[.text] | mod = 3, 0001:0032, size = 6, data crc = 0, reloc crc = 0 159CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ 160 .rdata debug directory data chunks 161CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0000, size = 28, data crc = 0, reloc crc = 0 162CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 163CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0028, size = 33, data crc = 0, reloc crc = 0 164CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 165CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0061, size = 20, data crc = 0, reloc crc = 0 166CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 167CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0081, size = 20, data crc = 0, reloc crc = 0 168CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 169CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0104, size = 8, data crc = 0, reloc crc = 0 170CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 171CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0112, size = 8, data crc = 0, reloc crc = 0 172CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 173CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0120, size = 8, data crc = 0, reloc crc = 0 174CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 175CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0128, size = 8, data crc = 0, reloc crc = 0 176CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 177CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0136, size = 8, data crc = 0, reloc crc = 0 178CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 179CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0144, size = 8, data crc = 0, reloc crc = 0 180CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 181CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0152, size = 12, data crc = 0, reloc crc = 0 182CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 183CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0164, size = 12, data crc = 0, reloc crc = 0 184CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 185CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0176, size = 33, data crc = 0, reloc crc = 0 186CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ 187