diff options
author | Mark Harmstone <mark@harmstone.com> | 2022-12-09 01:52:38 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-12-23 20:54:40 +1030 |
commit | 81814b6f5bd7be2ef719181286b375dcdd8a0f00 (patch) | |
tree | 372e59d512109222b9419481abd9407ad55b0be6 /ld/testsuite/ld-pe | |
parent | 817840046a160b2cccadee41d17db0af1912e070 (diff) | |
download | gdb-81814b6f5bd7be2ef719181286b375dcdd8a0f00.zip gdb-81814b6f5bd7be2ef719181286b375dcdd8a0f00.tar.gz gdb-81814b6f5bd7be2ef719181286b375dcdd8a0f00.tar.bz2 |
ld: Write globals stream in PDB
Diffstat (limited to 'ld/testsuite/ld-pe')
-rw-r--r-- | ld/testsuite/ld-pe/pdb-syms1-globals.d | 57 | ||||
-rw-r--r-- | ld/testsuite/ld-pe/pdb-syms1-records.d | 61 | ||||
-rw-r--r-- | ld/testsuite/ld-pe/pdb-syms1-symbols1.d | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-pe/pdb-syms1-symbols2.d | 56 | ||||
-rw-r--r-- | ld/testsuite/ld-pe/pdb-syms1a.s | 110 | ||||
-rw-r--r-- | ld/testsuite/ld-pe/pdb-syms1b.s | 737 | ||||
-rw-r--r-- | ld/testsuite/ld-pe/pdb.exp | 164 |
7 files changed, 1193 insertions, 0 deletions
diff --git a/ld/testsuite/ld-pe/pdb-syms1-globals.d b/ld/testsuite/ld-pe/pdb-syms1-globals.d new file mode 100644 index 0000000..356c5de --- /dev/null +++ b/ld/testsuite/ld-pe/pdb-syms1-globals.d @@ -0,0 +1,57 @@ + +*: file format binary + +Contents of section .data: + 0000 ffffffff 1a092ff1 d0000000 64020000 ....../.....d... + 0010 fd000000 01000000 35010000 01000000 ........5....... + 0020 15000000 01000000 19010000 01000000 ................ + 0030 c1000000 01000000 b9010000 01000000 ................ + 0040 d5000000 01000000 61010000 01000000 ........a....... + 0050 e9000000 01000000 11020000 01000000 ................ + 0060 e9010000 01000000 d5010000 01000000 ................ + 0070 49010000 01000000 a5010000 01000000 I............... + 0080 99010000 01000000 85000000 01000000 ................ + 0090 01000000 01000000 99000000 01000000 ................ + 00a0 7d010000 01000000 ad000000 01000000 }............... + 00b0 5d000000 01000000 49000000 01000000 ].......I....... + 00c0 21000000 02000000 35000000 01000000 !.......5....... + 00d0 fd010000 01000000 71000000 01000000 ........q....... + 00e0 00000000 00000000 00000000 00000000 ................ + 00f0 00000000 00000000 00000000 00000000 ................ + 0100 00000000 00000000 00000000 00000000 ................ + 0110 00000000 00000000 00000000 00000000 ................ + 0120 00000000 00000000 00000000 00000000 ................ + 0130 00000000 00000000 00000000 00000000 ................ + 0140 00000000 00000000 00000000 00000000 ................ + 0150 00000002 00000000 00000000 00000000 ................ + 0160 00000000 00000000 00000000 00000000 ................ + 0170 00000000 00020000 00000000 00000000 ................ + 0180 00000000 00000000 00000000 00000000 ................ + 0190 00000000 00000001 00000000 00000000 ................ + 01a0 00000000 00000000 00000000 00000000 ................ + 01b0 00000000 00000000 00000000 00000000 ................ + 01c0 00000000 00000000 00000000 00000000 ................ + 01d0 00000000 00000000 00000000 00000000 ................ + 01e0 08001000 00000000 00000000 00000040 ...............@ + 01f0 04002000 00000000 00000000 00000000 .. ............. + 0200 00000000 00000001 00000000 00000000 ................ + 0210 00000000 00000000 00000000 00000000 ................ + 0220 00000000 00000000 00000000 00000000 ................ + 0230 00000000 00000000 00080000 00004000 ..............@. + 0240 00000000 00000000 00100010 00000000 ................ + 0250 40000000 00000000 00000000 00000000 @............... + 0260 00000000 00000800 00000000 00000000 ................ + 0270 00000008 00000000 00000000 00000000 ................ + 0280 00000000 02004000 00000000 00000000 ......@......... + 0290 00000000 00008000 00000000 00000000 ................ + 02a0 00000000 00000000 10000000 00000000 ................ + 02b0 00000000 00000000 00000000 00800000 ................ + 02c0 00000000 00000000 00002000 00010000 .......... ..... + 02d0 00000000 00000000 00000000 00000040 ...............@ + 02e0 00000000 00000000 0c000000 18000000 ................ + 02f0 24000000 30000000 3c000000 48000000 $...0...<...H... + 0300 54000000 60000000 6c000000 78000000 T...`...l...x... + 0310 84000000 90000000 9c000000 a8000000 ................ + 0320 b4000000 c0000000 d8000000 e4000000 ................ + 0330 f0000000 fc000000 08010000 20010000 ............ ... + 0340 2c010000 ,...
\ No newline at end of file diff --git a/ld/testsuite/ld-pe/pdb-syms1-records.d b/ld/testsuite/ld-pe/pdb-syms1-records.d new file mode 100644 index 0000000..bbf6d7f --- /dev/null +++ b/ld/testsuite/ld-pe/pdb-syms1-records.d @@ -0,0 +1,61 @@ + +*: file format binary + +Contents of section .data: + 0000 12002511 00000000 04000000 01007072 ..%...........pr + 0010 6f633200 0a000811 04100000 62617200 oc2.........bar. + 0020 12000c11 00100000 08000000 02006c76 ..............lv + 0030 61723100 12000c11 00100000 0c000000 ar1............. + 0040 02006c76 61723100 12000c11 00100000 ..lvar1......... + 0050 00000000 03006c76 61723200 12000d11 ......lvar2..... + 0060 00100000 18000000 02006776 61723100 ..........gvar1. + 0070 12000d11 00100000 04000000 03006776 ..............gv + 0080 61723200 12002511 00000000 54000000 ar2...%.....T... + 0090 02007072 6f633100 12002511 00000000 ..proc1...%..... + 00a0 88000000 02007072 6f633200 12002711 ......proc2...'. + 00b0 00000000 f0000000 02007072 6f633300 ..........proc3. + 00c0 12002711 00000000 24010000 02007072 ..'.....$.....pr + 00d0 6f633400 12002511 00000000 58010000 oc4...%.....X... + 00e0 02007072 6f633500 12002511 00000000 ..proc5...%..... + 00f0 8c010000 02007072 6f633600 1a002511 ......proc6...%. + 0100 00000000 c0010000 0200666f 6f3a3a6d ..........foo::m + 0110 6574686f 64000000 1a002511 00000000 ethod.....%..... + 0120 f8010000 0200666f 6f3a3a6d 6574686f ......foo::metho + 0130 64320000 12002711 00000000 30020000 d2....'.....0... + 0140 02007072 6f633900 16002511 00000000 ..proc9...%..... + 0150 64020000 02007072 6f633130 00000000 d.....proc10.... + 0160 1a002711 00000000 98020000 0200666f ..'...........fo + 0170 6f3a3a6d 6574686f 64330000 1a002711 o::method3....'. + 0180 00000000 d0020000 0200666f 6f3a3a6d ..........foo::m + 0190 6574686f 64340000 0a000811 0a100000 ethod4.......... + 01a0 666f6f00 12000711 75000000 2a00616e foo.....u...*.an + 01b0 73776572 00f3f2f1 1a000711 23000000 swer........#... + 01c0 0a80efcd ab896745 2301616e 73776572 ......gE#.answer + 01d0 3200f2f1 12001211 00100000 20000000 2........... ... + 01e0 02006c76 61723500 12001211 00100000 ..lvar5......... + 01f0 12000000 03006c76 61723600 12001311 ......lvar6..... + 0200 00100000 1c000000 02006776 61723300 ..........gvar3. + 0210 12001311 00100000 08000000 03006776 ..............gv + 0220 61723400 12000e11 00000000 18000000 ar4............. + 0230 02006776 61723100 12000e11 00000000 ..gvar1......... + 0240 04000000 03006776 61723200 12000e11 ......gvar2..... + 0250 00000000 0c000000 03007072 6f633100 ..........proc1. + 0260 12000e11 02000000 06000000 01007072 ..............pr + 0270 6f633200 12000e11 00000000 0d000000 oc2............. + 0280 03007072 6f633300 12000e11 02000000 ..proc3......... + 0290 07000000 01007072 6f633400 12000e11 ......proc4..... + 02a0 00000000 0e000000 03007072 6f633500 ..........proc5. + 02b0 12000e11 02000000 08000000 01007072 ..............pr + 02c0 6f633600 12000e11 00000000 0f000000 oc6............. + 02d0 03007072 6f633700 12000e11 02000000 ..proc7......... + 02e0 09000000 01007072 6f633800 12000e11 ......proc8..... + 02f0 00000000 10000000 03007072 6f633900 ..........proc9. + 0300 16000e11 02000000 0a000000 01007072 ..............pr + 0310 6f633130 00000000 16000e11 00000000 oc10............ + 0320 11000000 03007072 6f633131 00000000 ......proc11.... + 0330 16000e11 02000000 0b000000 01007072 ..............pr + 0340 6f633132 00000000 12000e11 00000000 oc12............ + 0350 1c000000 02006776 61723300 12000e11 ......gvar3..... + 0360 00000000 08000000 03006776 61723400 ..........gvar4. + 0370 12000e11 02000000 00000000 01006d61 ..............ma + 0380 696e0000 in..
\ No newline at end of file diff --git a/ld/testsuite/ld-pe/pdb-syms1-symbols1.d b/ld/testsuite/ld-pe/pdb-syms1-symbols1.d new file mode 100644 index 0000000..4de22ac --- /dev/null +++ b/ld/testsuite/ld-pe/pdb-syms1-symbols1.d @@ -0,0 +1,8 @@ + +*: file format binary + +Contents of section .data: + 0000 04000000 2e001011 00000000 34000000 ............4... + 0010 00000000 01000000 00000000 00000000 ................ + 0020 02100000 06000000 01000070 726f6332 ...........proc2 + 0030 00f3f2f1 02000600 00000000 ............
\ No newline at end of file diff --git a/ld/testsuite/ld-pe/pdb-syms1-symbols2.d b/ld/testsuite/ld-pe/pdb-syms1-symbols2.d new file mode 100644 index 0000000..f134637 --- /dev/null +++ b/ld/testsuite/ld-pe/pdb-syms1-symbols2.d @@ -0,0 +1,56 @@ + +*: file format binary + +Contents of section .data: + 0000 04000000 12000c11 00100000 08000000 ................ + 0010 02006c76 61723100 12000c11 00100000 ..lvar1......... + 0020 08000000 02006c76 61723100 12000c11 ......lvar1..... + 0030 00100000 0c000000 02006c76 61723100 ..........lvar1. + 0040 12000c11 00100000 00000000 03006c76 ..............lv + 0050 61723200 2e001011 00000000 84000000 ar2............. + 0060 00000000 01000000 00000000 00000000 ................ + 0070 05100000 0c000000 03000070 726f6331 ...........proc1 + 0080 00f3f2f1 02000600 2e001011 00000000 ................ + 0090 ec000000 00000000 01000000 00000000 ................ + 00a0 00000000 05100000 06000000 01000070 ...............p + 00b0 726f6332 00f3f2f1 0a000811 04100000 roc2............ + 00c0 62617200 12000c11 00100000 10000000 bar............. + 00d0 02006c76 61723300 12001211 00100000 ..lvar3......... + 00e0 14000000 02006c76 61723400 02000600 ......lvar4..... + 00f0 2e000f11 00000000 20010000 00000000 ........ ....... + 0100 01000000 00000000 00000000 05100000 ................ + 0110 0d000000 03000070 726f6333 00f3f2f1 .......proc3.... + 0120 02000600 2e000f11 00000000 54010000 ............T... + 0130 00000000 01000000 00000000 00000000 ................ + 0140 05100000 07000000 01000070 726f6334 ...........proc4 + 0150 00f3f2f1 02000600 2e001011 00000000 ................ + 0160 88010000 00000000 01000000 00000000 ................ + 0170 00000000 05100000 0e000000 03000070 ...............p + 0180 726f6335 00f3f2f1 02000600 2e001011 roc5............ + 0190 00000000 bc010000 00000000 01000000 ................ + 01a0 00000000 00000000 05100000 08000000 ................ + 01b0 01000070 726f6336 00f3f2f1 02000600 ...proc6........ + 01c0 32001011 00000000 f4010000 00000000 2............... + 01d0 01000000 00000000 00000000 05100000 ................ + 01e0 0f000000 03000066 6f6f3a3a 6d657468 .......foo::meth + 01f0 6f6400f1 02000600 32001011 00000000 od......2....... + 0200 2c020000 00000000 01000000 00000000 ,............... + 0210 00000000 05100000 09000000 01000066 ...............f + 0220 6f6f3a3a 6d657468 6f643200 02000600 oo::method2..... + 0230 2e000f11 00000000 60020000 00000000 ........`....... + 0240 01000000 00000000 00000000 05100000 ................ + 0250 10000000 03000070 726f6339 00f3f2f1 .......proc9.... + 0260 02000600 2e001011 00000000 94020000 ................ + 0270 00000000 01000000 00000000 00000000 ................ + 0280 05100000 0a000000 01000070 726f6331 ...........proc1 + 0290 3000f2f1 02000600 32000f11 00000000 0.......2....... + 02a0 cc020000 00000000 01000000 00000000 ................ + 02b0 00000000 05100000 11000000 03000066 ...............f + 02c0 6f6f3a3a 6d657468 6f643300 02000600 oo::method3..... + 02d0 32000f11 00000000 04030000 00000000 2............... + 02e0 01000000 00000000 00000000 05100000 ................ + 02f0 0b000000 01000066 6f6f3a3a 6d657468 .......foo::meth + 0300 6f643400 02000600 12001211 00100000 od4............. + 0310 20000000 02006c76 61723500 12001211 .....lvar5..... + 0320 00100000 12000000 03006c76 61723600 ..........lvar6. + 0330 00000000 ....
\ No newline at end of file diff --git a/ld/testsuite/ld-pe/pdb-syms1a.s b/ld/testsuite/ld-pe/pdb-syms1a.s new file mode 100644 index 0000000..c1929c3 --- /dev/null +++ b/ld/testsuite/ld-pe/pdb-syms1a.s @@ -0,0 +1,110 @@ +.equ CV_SIGNATURE_C13, 4 +.equ DEBUG_S_SYMBOLS, 0xf1 + +.equ T_UINT4, 0x0075 + +.equ LF_MODIFIER, 0x1001 +.equ LF_PROCEDURE, 0x1008 +.equ LF_ARGLIST, 0x1201 +.equ LF_FIELDLIST, 0x1203 +.equ LF_STRUCTURE, 0x1505 +.equ LF_MEMBER, 0x150d + +.equ S_END, 0x0006 +.equ S_UDT, 0x1108 +.equ S_GPROC32, 0x1110 + +.section ".debug$S", "rn" + +.long CV_SIGNATURE_C13 + +.long DEBUG_S_SYMBOLS +.long .syms_end - .syms_start + +.syms_start: + +.gproc2: +.short .gproc2_end - .gproc2 - 2 +.short S_GPROC32 +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long 1 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x1002 # type +.secrel32 proc2 +.secidx proc2 +.byte 0 # flags +.asciz "proc2" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.gproc2_end: +.short .udt1 - .gproc2_end - 2 +.short S_END + +.udt1: +.short .syms_end - .udt1 - 2 +.short S_UDT +.long 0x1004 # struct bar +.asciz "bar" + +.syms_end: + +.section ".debug$T", "rn" + +.long CV_SIGNATURE_C13 + +# Type 1000, const uint32_t +.mod1: +.short .arglist1 - .mod1 - 2 +.short LF_MODIFIER +.long T_UINT4 +.short 1 # const +.p2align 2 + +# Type 1001, arglist (uint32_t) +.arglist1: +.short .proctype1 - .arglist1 - 2 +.short LF_ARGLIST +.long 1 # no. entries +.long T_UINT4 + +# Type 1002, procedure (return type T_VOID, arglist 1001) +.proctype1: +.short .fieldlist1 - .proctype1 - 2 +.short LF_PROCEDURE +.long T_VOID +.byte 0 # calling convention +.byte 0 # attributes +.short 1 # no. parameters +.long 0x1001 + +# Type 1003, field list for struct bar +.fieldlist1: +.short .struct1 - .fieldlist1 - 2 +.short LF_FIELDLIST +.short LF_MEMBER +.short 3 # public +.long T_UINT4 +.short 0 # offset +.asciz "num1" +.byte 0xf1 # padding + +# Type 1004, declaration of struct bar +.struct1: +.short .types_end - .struct1 - 2 +.short LF_STRUCTURE +.short 1 # no. members +.short 0 # property +.long 0x1003 # field list +.long 0 # type derived from +.long 0 # type of vshape table +.short 4 # size +.asciz "bar" # name +.byte 0xf2 # padding +.byte 0xf1 # padding + +.types_end: diff --git a/ld/testsuite/ld-pe/pdb-syms1b.s b/ld/testsuite/ld-pe/pdb-syms1b.s new file mode 100644 index 0000000..ddc4711 --- /dev/null +++ b/ld/testsuite/ld-pe/pdb-syms1b.s @@ -0,0 +1,737 @@ +.equ CV_SIGNATURE_C13, 4 +.equ DEBUG_S_SYMBOLS, 0xf1 + +.equ T_VOID, 0x0003 +.equ T_UQUAD, 0x0023 +.equ T_UINT4, 0x0075 + +.equ LF_MODIFIER, 0x1001 +.equ LF_POINTER, 0x1002 +.equ LF_PROCEDURE, 0x1008 +.equ LF_MFUNCTION, 0x1009 +.equ LF_ARGLIST, 0x1201 +.equ LF_FIELDLIST, 0x1203 +.equ LF_CLASS, 0x1504 +.equ LF_STRUCTURE, 0x1505 +.equ LF_MEMBER, 0x150d +.equ LF_ONEMETHOD, 0x1511 +.equ LF_FUNC_ID, 0x1601 +.equ LF_MFUNC_ID, 0x1602 + +.equ LF_UQUADWORD, 0x800a + +.equ S_END, 0x0006 +.equ S_CONSTANT, 0x1107 +.equ S_UDT, 0x1108 +.equ S_LDATA32, 0x110c +.equ S_GDATA32, 0x110d +.equ S_LPROC32, 0x110f +.equ S_GPROC32, 0x1110 +.equ S_LTHREAD32, 0x1112 +.equ S_GTHREAD32, 0x1113 +.equ S_LPROC32_ID, 0x1146 +.equ S_GPROC32_ID, 0x1147 +.equ S_PROC_ID_END, 0x114f + +.equ CV_PTR_64, 0xc + +.section ".debug$S", "rn" + +.long CV_SIGNATURE_C13 + +.long DEBUG_S_SYMBOLS +.long .syms_end - .syms_start + +.syms_start: + +.ldata1: +.short .ldata1a - .ldata1 - 2 +.short S_LDATA32 +.long 0x1000 # const uint32_t +.secrel32 lvar1 +.secidx lvar1 +.asciz "lvar1" + +.ldata1a: # duplicate with same address +.short .ldata1b - .ldata1a - 2 +.short S_LDATA32 +.long 0x1000 # const uint32_t +.secrel32 lvar1 +.secidx lvar1 +.asciz "lvar1" + +.ldata1b: # duplicate with different address +.short .ldata2 - .ldata1b - 2 +.short S_LDATA32 +.long 0x1000 # const uint32_t +.secrel32 lvar1a +.secidx lvar1a +.asciz "lvar1" + +.ldata2: +.short .gdata1 - .ldata2 - 2 +.short S_LDATA32 +.long 0x1000 # const uint32_t +.secrel32 lvar2 +.secidx lvar2 +.asciz "lvar2" + +.gdata1: +.short .gdata2 - .gdata1 - 2 +.short S_GDATA32 +.long 0x1000 # const uint32_t +.secrel32 gvar1 +.secidx gvar1 +.asciz "gvar1" + +.gdata2: +.short .gproc1 - .gdata2 - 2 +.short S_GDATA32 +.long 0x1000 # const uint32_t +.secrel32 gvar2 +.secidx gvar2 +.asciz "gvar2" + +.gproc1: +.short .gproc1_end - .gproc1 - 2 +.short S_GPROC32 +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc1_end - proc1 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x1002 # type +.secrel32 proc1 +.secidx proc1 +.byte 0 # flags +.asciz "proc1" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.gproc1_end: +.short .gproc2 - .gproc1_end - 2 +.short S_END + +.gproc2: +.short .udt1 - .gproc2 - 2 +.short S_GPROC32 +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc2_end - proc2 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x1002 # type +.secrel32 proc2 +.secidx proc2 +.byte 0 # flags +.asciz "proc2" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.udt1: +.short .ldata3 - .udt1 - 2 +.short S_UDT +.long 0x1011 # struct bar +.asciz "bar" + +.ldata3: +.short .lthread1 - .ldata3 - 2 +.short S_LDATA32 +.long 0x1000 # const uint32_t +.secrel32 lvar3 +.secidx lvar3 +.asciz "lvar3" + +.lthread1: +.short .gproc2_end - .lthread1 - 2 +.short S_LTHREAD32 +.long 0x1000 # const uint32_t +.secrel32 lvar4 +.secidx lvar4 +.asciz "lvar4" + +.gproc2_end: +.short .gproc3 - .gproc2_end - 2 +.short S_END + +.gproc3: +.short .gproc3_end - .gproc3 - 2 +.short S_LPROC32 +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc3_end - proc3 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x1002 # type +.secrel32 proc3 +.secidx proc3 +.byte 0 # flags +.asciz "proc3" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.gproc3_end: +.short .gproc4 - .gproc3_end - 2 +.short S_END + +.gproc4: +.short .gproc4_end - .gproc4 - 2 +.short S_LPROC32 +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc4_end - proc4 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x1002 # type +.secrel32 proc4 +.secidx proc4 +.byte 0 # flags +.asciz "proc4" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.gproc4_end: +.short .gproc5 - .gproc4_end - 2 +.short S_END + +.gproc5: +.short .gproc5_end - .gproc5 - 2 +.short S_GPROC32_ID +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc5_end - proc5 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x1003 # func ID +.secrel32 proc5 +.secidx proc5 +.byte 0 # flags +.asciz "proc5" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.gproc5_end: +.short .gproc6 - .gproc5_end - 2 +.short S_PROC_ID_END + +.gproc6: +.short .gproc6_end - .gproc6 - 2 +.short S_GPROC32_ID +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc6_end - proc6 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x1004 # func ID +.secrel32 proc6 +.secidx proc6 +.byte 0 # flags +.asciz "proc6" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.gproc6_end: +.short .gproc7 - .gproc6_end - 2 +.short S_PROC_ID_END + +.gproc7: +.short .gproc7_end - .gproc7 - 2 +.short S_GPROC32_ID +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc7_end - proc7 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x100a # func ID +.secrel32 proc7 +.secidx proc7 +.byte 0 # flags +.asciz "foo::method" +.byte 0xf1 # padding + +.gproc7_end: +.short .gproc8 - .gproc7_end - 2 +.short S_PROC_ID_END + +.gproc8: +.short .gproc8_end - .gproc8 - 2 +.short S_GPROC32_ID +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc8_end - proc8 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x100b # func ID +.secrel32 proc8 +.secidx proc8 +.byte 0 # flags +.asciz "foo::method2" + +.gproc8_end: +.short .gproc9 - .gproc8_end - 2 +.short S_PROC_ID_END + +.gproc9: +.short .gproc9_end - .gproc9 - 2 +.short S_LPROC32_ID +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc9_end - proc9 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x100c # func ID +.secrel32 proc9 +.secidx proc9 +.byte 0 # flags +.asciz "proc9" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.gproc9_end: +.short .gproc10 - .gproc9_end - 2 +.short S_PROC_ID_END + +.gproc10: +.short .gproc10_end - .gproc10 - 2 +.short S_GPROC32_ID +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc10_end - proc10 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x100d # func ID +.secrel32 proc10 +.secidx proc10 +.byte 0 # flags +.asciz "proc10" +.byte 0xf2 # padding +.byte 0xf1 # padding + +.gproc10_end: +.short .gproc11 - .gproc10_end - 2 +.short S_PROC_ID_END + +.gproc11: +.short .gproc11_end - .gproc11 - 2 +.short S_LPROC32_ID +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc11_end - proc11 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x100e # func ID +.secrel32 proc11 +.secidx proc11 +.byte 0 # flags +.asciz "foo::method3" + +.gproc11_end: +.short .gproc12 - .gproc11_end - 2 +.short S_PROC_ID_END + +.gproc12: +.short .gproc12_end - .gproc12 - 2 +.short S_LPROC32_ID +.long 0 # parent +.long 0 # end +.long 0 # next symbol +.long .proc12_end - proc12 # length +.long 0 # debug start offset +.long 0 # debug end offset +.long 0x100f # func ID +.secrel32 proc12 +.secidx proc12 +.byte 0 # flags +.asciz "foo::method4" + +.gproc12_end: +.short .udt2 - .gproc12_end - 2 +.short S_PROC_ID_END + +.udt2: +.short .constant1 - .udt2 - 2 +.short S_UDT +.long 0x1009 # class foo +.asciz "foo" + +.constant1: +.short .constant2 - .constant1 - 2 +.short S_CONSTANT +.long T_UINT4 +.short 42 +.asciz "answer" +.byte 0xf3 # padding +.byte 0xf2 # padding +.byte 0xf1 # padding + +.constant2: +.short .lthread2 - .constant2 - 2 +.short S_CONSTANT +.long T_UQUAD +.short LF_UQUADWORD +.quad 0x0123456789abcdef +.asciz "answer2" +.byte 0xf2 # padding +.byte 0xf1 # padding + +.lthread2: +.short .lthread3 - .lthread2 - 2 +.short S_LTHREAD32 +.long 0x1000 # const uint32_t +.secrel32 lvar5 +.secidx lvar5 +.asciz "lvar5" + +.lthread3: +.short .gthread1 - .lthread3 - 2 +.short S_LTHREAD32 +.long 0x1000 # const uint32_t +.secrel32 lvar6 +.secidx lvar6 +.asciz "lvar6" + +.gthread1: +.short .gthread2 - .gthread1 - 2 +.short S_GTHREAD32 +.long 0x1000 # const uint32_t +.secrel32 gvar3 +.secidx gvar3 +.asciz "gvar3" + +.gthread2: +.short .syms_end - .gthread2 - 2 +.short S_GTHREAD32 +.long 0x1000 # const uint32_t +.secrel32 gvar4 +.secidx gvar4 +.asciz "gvar4" + +.p2align 2 +.syms_end: + +.section ".debug$T", "rn" + +.long CV_SIGNATURE_C13 + +# Type 1000, const uint32_t +.mod1: +.short .arglist1 - .mod1 - 2 +.short LF_MODIFIER +.long T_UINT4 +.short 1 # const +.p2align 2 + +# Type 1001, arglist (uint32_t) +.arglist1: +.short .proctype1 - .arglist1 - 2 +.short LF_ARGLIST +.long 1 # no. entries +.long T_UINT4 + +# Type 1002, procedure (return type T_VOID, arglist 1001) +.proctype1: +.short .funcid1 - .proctype1 - 2 +.short LF_PROCEDURE +.long T_VOID +.byte 0 # calling convention +.byte 0 # attributes +.short 1 # no. parameters +.long 0x1001 + +# Type 1003, func ID for proc5 +.funcid1: +.short .funcid2 - .funcid1 - 2 +.short LF_FUNC_ID +.long 0 # parent scope +.long 0x1002 # type +.asciz "proc5" +.byte 0xf2 # padding +.byte 0xf1 # padding + +# Type 1004, func ID for proc6 +.funcid2: +.short .class1 - .funcid2 - 2 +.short LF_FUNC_ID +.long 0 # parent scope +.long 0x1002 # type +.asciz "proc6" +.byte 0xf2 # padding +.byte 0xf1 # padding + +# Type 1005, forward declaration of class foo +.class1: +.short .ptr1 - .class1 - 2 +.short LF_CLASS +.short 0 # no. members +.short 0x80 # property (forward declaration) +.long 0 # field list +.long 0 # type derived from +.long 0 # type of vshape table +.short 0 # size +.asciz "foo" # name +.byte 0xf2 # padding +.byte 0xf1 # padding + +# Type 1006, pointer to 1005 +.ptr1: +.short .mfunction1 - .ptr1 - 2 +.short LF_POINTER +.long 0x1005 +.long (8 << 13) | CV_PTR_64 + +# Type 1007, member function of 1005, return type void, arg list 1001 +.mfunction1: +.short .fieldlist1 - .mfunction1 - 2 +.short LF_MFUNCTION +.long T_VOID +.long 0x1005 +.long 0x1006 # type of "this" pointer +.byte 0 # calling convention +.byte 0 # attributes +.short 1 # no. parameters +.long 0x1001 # arg list +.long 0 # "this" adjustment + +# Type 1008, field list for class foo +.fieldlist1: +.short .class2 - .fieldlist1 - 2 +.short LF_FIELDLIST +.short LF_ONEMETHOD +.short 0 # method attribute +.long 0x1007 # method type +.asciz "method" +.byte 0xf1 # padding +.short LF_ONEMETHOD +.short 0 # method attribute +.long 0x1007 # method type +.asciz "method2" +.short LF_ONEMETHOD +.short 0 # method attribute +.long 0x1007 # method type +.asciz "method3" +.short LF_ONEMETHOD +.short 0 # method attribute +.long 0x1007 # method type +.asciz "method4" + +# Type 1009, actual declaration of class foo +.class2: +.short .mfunc1 - .class2 - 2 +.short LF_CLASS +.short 0 # no. members +.short 0 # property +.long 0x1008 # field list +.long 0 # type derived from +.long 0 # type of vshape table +.short 0 # size +.asciz "foo" # name +.byte 0xf2 # padding +.byte 0xf1 # padding + +# Type 100a, function "method" within class "foo" +.mfunc1: +.short .mfunc2 - .mfunc1 - 2 +.short LF_MFUNC_ID +.long 0x1009 # parent class +.long 0x1002 # function type +.asciz "method" +.byte 0xf1 # padding + +# Type 100b, function "method2" within class "foo" +.mfunc2: +.short .funcid3 - .mfunc2 - 2 +.short LF_MFUNC_ID +.long 0x1009 # parent class +.long 0x1002 # function type +.asciz "method2" + +# Type 100c, func ID for proc9 +.funcid3: +.short .funcid4 - .funcid3 - 2 +.short LF_FUNC_ID +.long 0 # parent scope +.long 0x1002 # type +.asciz "proc9" +.byte 0xf2 # padding +.byte 0xf1 # padding + +# Type 100d, func ID for proc10 +.funcid4: +.short .mfunc3 - .funcid4 - 2 +.short LF_FUNC_ID +.long 0 # parent scope +.long 0x1002 # type +.asciz "proc10" +.byte 0xf1 # padding + +# Type 100e, function "method3" within class "foo" +.mfunc3: +.short .mfunc4 - .mfunc3 - 2 +.short LF_MFUNC_ID +.long 0x1009 # parent class +.long 0x1002 # function type +.asciz "method3" + +# Type 100f, function "method4" within class "foo" +.mfunc4: +.short .fieldlist2 - .mfunc4 - 2 +.short LF_MFUNC_ID +.long 0x1009 # parent class +.long 0x1002 # function type +.asciz "method4" + +# Type 1010, field list for struct bar +.fieldlist2: +.short .struct1 - .fieldlist2 - 2 +.short LF_FIELDLIST +.short LF_MEMBER +.short 3 # public +.long T_UINT4 +.short 0 # offset +.asciz "num1" +.byte 0xf1 # padding + +# Type 1011, declaration of struct bar +.struct1: +.short .types_end - .struct1 - 2 +.short LF_STRUCTURE +.short 1 # no. members +.short 0 # property +.long 0x1010 # field list +.long 0 # type derived from +.long 0 # type of vshape table +.short 4 # size +.asciz "bar" # name +.byte 0xf2 # padding +.byte 0xf1 # padding + +.types_end: + +.data + +.long 0x12345678 +.long 0x12345678 + +lvar1: +.long 42 + +lvar1a: +.long 0x12345678 + +lvar3: +.long 84 + +lvar4: +.long 85 + +.global gvar1 +gvar1: +.long 43 + +.global gvar3 +gvar3: +.long 41 + +lvar5: +.long 86 + +.text + +.global main +main: + jmp main + .secrel32 .data + +.global proc2 +proc2: + nop +.proc2_end: + +.global proc4 +proc4: + nop +.proc4_end: + +.global proc6 +proc6: + nop +.proc6_end: + +.global proc8 +proc8: + nop +.proc8_end: + +.global proc10 +proc10: + nop +.proc10_end: + +.global proc12 +proc12: + nop +.proc12_end: + +.section "gcsect" + +lvar2: +.long 84 + +.global gvar2 +gvar2: +.long 85 + +.global gvar4 +gvar4: +.long 86 + +.global proc1 +proc1: + nop +.proc1_end: + +.global proc3 +proc3: + nop +.proc3_end: + +.global proc5 +proc5: + nop +.proc5_end: + +.global proc7 +proc7: + nop +.proc7_end: + +.global proc9 +proc9: + nop +.proc9_end: + +.global proc11 +proc11: + nop +.proc11_end: + +lvar6: +.long 86 diff --git a/ld/testsuite/ld-pe/pdb.exp b/ld/testsuite/ld-pe/pdb.exp index 1a54168..34eafc1 100644 --- a/ld/testsuite/ld-pe/pdb.exp +++ b/ld/testsuite/ld-pe/pdb.exp @@ -1451,6 +1451,169 @@ proc test7 { } { } } +proc test8 { } { + global as + global ar + global ld + global objdump + global srcdir + global subdir + + if ![ld_assemble $as $srcdir/$subdir/pdb-syms1a.s tmpdir/pdb-syms1a.o] { + unsupported "Build pdb-syms1a.o" + return + } + + if ![ld_assemble $as $srcdir/$subdir/pdb-syms1b.s tmpdir/pdb-syms1b.o] { + unsupported "Build pdb-syms1b.o" + return + } + + if ![ld_link $ld "tmpdir/pdb-syms1.exe" "--pdb=tmpdir/pdb-syms1.pdb tmpdir/pdb-syms1a.o tmpdir/pdb-syms1b.o"] { + unsupported "Create PE image with PDB file" + return + } + + # get index of globals stream and records stream + + set exec_output [run_host_cmd "$ar" "x --output tmpdir tmpdir/pdb-syms1.pdb 0003"] + + if ![string match "" $exec_output] { + fail "Could not extract DBI stream" + return + } else { + pass "Extracted DBI stream" + } + + set fi [open tmpdir/0003] + fconfigure $fi -translation binary + + seek $fi 12 + set data [read $fi 2] + binary scan $data s globals_index + + seek $fi 6 current + set data [read $fi 2] + binary scan $data s records_index + + seek $fi 2 current + set data [read $fi 4] + binary scan $data i mod_info_size + + seek $fi 36 current + set mod_info [read $fi $mod_info_size] + + close $fi + + # get index of first and second module streams + + binary scan [string range $mod_info 34 35] s mod1_index + + set off 64 + + set obj1 [string range $mod_info $off [expr [string first \000 $mod_info $off] - 1]] + incr off [expr [string length $obj1] + 1] + + set ar1 [string range $mod_info $off [expr [string first \000 $mod_info $off] - 1]] + incr off [expr [string length $ar1] + 1] + + if { [expr $off % 4] != 0 } { + set off [expr $off + 4 - ($off % 4)] + } + + incr off 34 + + binary scan [string range $mod_info $off [expr $off + 1]] s mod2_index + + # check globals stream + + set index_str [format "%04x" $globals_index] + + set exec_output [run_host_cmd "$ar" "x --output tmpdir tmpdir/pdb-syms1.pdb $index_str"] + + if ![string match "" $exec_output] { + fail "Could not extract globals stream" + return + } else { + pass "Extracted globals stream" + } + + set exp [file_contents "$srcdir/$subdir/pdb-syms1-globals.d"] + set got [run_host_cmd "$objdump" "-s --target=binary tmpdir/$index_str"] + + if [string match $exp $got] { + pass "Correct globals stream" + } else { + fail "Incorrect globals stream" + } + + # check records stream + + set index_str [format "%04x" $records_index] + + set exec_output [run_host_cmd "$ar" "x --output tmpdir tmpdir/pdb-syms1.pdb $index_str"] + + if ![string match "" $exec_output] { + fail "Could not extract records stream" + return + } else { + pass "Extracted records stream" + } + + set exp [file_contents "$srcdir/$subdir/pdb-syms1-records.d"] + set got [run_host_cmd "$objdump" "-s --target=binary tmpdir/$index_str"] + + if [string match $exp $got] { + pass "Correct records stream" + } else { + fail "Incorrect records stream" + } + + # check symbols in first module + + set index_str [format "%04x" $mod1_index] + + set exec_output [run_host_cmd "$ar" "x --output tmpdir tmpdir/pdb-syms1.pdb $index_str"] + + if ![string match "" $exec_output] { + fail "Could not extract first module's symbols" + return + } else { + pass "Extracted first module's symbols" + } + + set exp [file_contents "$srcdir/$subdir/pdb-syms1-symbols1.d"] + set got [run_host_cmd "$objdump" "-s --target=binary tmpdir/$index_str"] + + if [string match $exp $got] { + pass "Correct symbols in first module's stream" + } else { + fail "Incorrect symbols in first module's stream" + } + + # check symbols in second module + + set index_str [format "%04x" $mod2_index] + + set exec_output [run_host_cmd "$ar" "x --output tmpdir tmpdir/pdb-syms1.pdb $index_str"] + + if ![string match "" $exec_output] { + fail "Could not extract second module's symbols" + return + } else { + pass "Extracted second module's symbols" + } + + set exp [file_contents "$srcdir/$subdir/pdb-syms1-symbols2.d"] + set got [run_host_cmd "$objdump" "-s --target=binary tmpdir/$index_str"] + + if [string match $exp $got] { + pass "Correct symbols in second module's stream" + } else { + fail "Incorrect symbols in second module's stream" + } +} + test1 test2 test3 @@ -1458,3 +1621,4 @@ test4 test5 test6 test7 +test8 |