xref: /openbmc/qemu/contrib/elf2dmp/pdb.h (revision 1c268991b3fe699fee16b1cbb9c6025d334c5b25)
13fa2d384SViktor Prutyanov /*
23fa2d384SViktor Prutyanov  * Copyright (c) 2018 Virtuozzo International GmbH
33fa2d384SViktor Prutyanov  *
43fa2d384SViktor Prutyanov  * This work is licensed under the terms of the GNU GPL, version 2 or later.
53fa2d384SViktor Prutyanov  *
63fa2d384SViktor Prutyanov  */
73fa2d384SViktor Prutyanov 
83fa2d384SViktor Prutyanov #ifndef PDB_H
93fa2d384SViktor Prutyanov #define PDB_H
103fa2d384SViktor Prutyanov 
113fa2d384SViktor Prutyanov 
124591f4ceSViktor Prutyanov #ifndef _WIN32
133fa2d384SViktor Prutyanov typedef struct GUID {
143fa2d384SViktor Prutyanov     unsigned int Data1;
153fa2d384SViktor Prutyanov     unsigned short Data2;
163fa2d384SViktor Prutyanov     unsigned short Data3;
173fa2d384SViktor Prutyanov     unsigned char Data4[8];
183fa2d384SViktor Prutyanov } GUID;
194591f4ceSViktor Prutyanov #endif
203fa2d384SViktor Prutyanov 
213fa2d384SViktor Prutyanov struct PDB_FILE {
223fa2d384SViktor Prutyanov     uint32_t size;
233fa2d384SViktor Prutyanov     uint32_t unknown;
243fa2d384SViktor Prutyanov };
253fa2d384SViktor Prutyanov 
263fa2d384SViktor Prutyanov typedef struct PDB_DS_HEADER {
273fa2d384SViktor Prutyanov     char signature[32];
283fa2d384SViktor Prutyanov     uint32_t block_size;
293fa2d384SViktor Prutyanov     uint32_t unknown1;
303fa2d384SViktor Prutyanov     uint32_t num_pages;
313fa2d384SViktor Prutyanov     uint32_t toc_size;
323fa2d384SViktor Prutyanov     uint32_t unknown2;
333fa2d384SViktor Prutyanov     uint32_t toc_page;
343fa2d384SViktor Prutyanov } PDB_DS_HEADER;
353fa2d384SViktor Prutyanov 
363fa2d384SViktor Prutyanov typedef struct PDB_DS_TOC {
373fa2d384SViktor Prutyanov     uint32_t num_files;
383fa2d384SViktor Prutyanov     uint32_t file_size[1];
393fa2d384SViktor Prutyanov } PDB_DS_TOC;
403fa2d384SViktor Prutyanov 
413fa2d384SViktor Prutyanov typedef struct PDB_DS_ROOT {
423fa2d384SViktor Prutyanov     uint32_t Version;
433fa2d384SViktor Prutyanov     uint32_t TimeDateStamp;
443fa2d384SViktor Prutyanov     uint32_t Age;
453fa2d384SViktor Prutyanov     GUID guid;
463fa2d384SViktor Prutyanov     uint32_t cbNames;
473fa2d384SViktor Prutyanov     char names[1];
483fa2d384SViktor Prutyanov } PDB_DS_ROOT;
493fa2d384SViktor Prutyanov 
503fa2d384SViktor Prutyanov typedef struct PDB_TYPES_OLD {
513fa2d384SViktor Prutyanov     uint32_t version;
523fa2d384SViktor Prutyanov     uint16_t first_index;
533fa2d384SViktor Prutyanov     uint16_t last_index;
543fa2d384SViktor Prutyanov     uint32_t type_size;
553fa2d384SViktor Prutyanov     uint16_t file;
563fa2d384SViktor Prutyanov     uint16_t pad;
573fa2d384SViktor Prutyanov } PDB_TYPES_OLD;
583fa2d384SViktor Prutyanov 
593fa2d384SViktor Prutyanov typedef struct PDB_TYPES {
603fa2d384SViktor Prutyanov     uint32_t version;
613fa2d384SViktor Prutyanov     uint32_t type_offset;
623fa2d384SViktor Prutyanov     uint32_t first_index;
633fa2d384SViktor Prutyanov     uint32_t last_index;
643fa2d384SViktor Prutyanov     uint32_t type_size;
653fa2d384SViktor Prutyanov     uint16_t file;
663fa2d384SViktor Prutyanov     uint16_t pad;
673fa2d384SViktor Prutyanov     uint32_t hash_size;
683fa2d384SViktor Prutyanov     uint32_t hash_base;
693fa2d384SViktor Prutyanov     uint32_t hash_offset;
703fa2d384SViktor Prutyanov     uint32_t hash_len;
713fa2d384SViktor Prutyanov     uint32_t search_offset;
723fa2d384SViktor Prutyanov     uint32_t search_len;
733fa2d384SViktor Prutyanov     uint32_t unknown_offset;
743fa2d384SViktor Prutyanov     uint32_t unknown_len;
753fa2d384SViktor Prutyanov } PDB_TYPES;
763fa2d384SViktor Prutyanov 
773fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_RANGE {
783fa2d384SViktor Prutyanov     uint16_t segment;
793fa2d384SViktor Prutyanov     uint16_t pad1;
803fa2d384SViktor Prutyanov     uint32_t offset;
813fa2d384SViktor Prutyanov     uint32_t size;
823fa2d384SViktor Prutyanov     uint32_t characteristics;
833fa2d384SViktor Prutyanov     uint16_t index;
843fa2d384SViktor Prutyanov     uint16_t pad2;
853fa2d384SViktor Prutyanov } PDB_SYMBOL_RANGE;
863fa2d384SViktor Prutyanov 
873fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_RANGE_EX {
883fa2d384SViktor Prutyanov     uint16_t segment;
893fa2d384SViktor Prutyanov     uint16_t pad1;
903fa2d384SViktor Prutyanov     uint32_t offset;
913fa2d384SViktor Prutyanov     uint32_t size;
923fa2d384SViktor Prutyanov     uint32_t characteristics;
933fa2d384SViktor Prutyanov     uint16_t index;
943fa2d384SViktor Prutyanov     uint16_t pad2;
953fa2d384SViktor Prutyanov     uint32_t timestamp;
963fa2d384SViktor Prutyanov     uint32_t unknown;
973fa2d384SViktor Prutyanov } PDB_SYMBOL_RANGE_EX;
983fa2d384SViktor Prutyanov 
993fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_FILE {
1003fa2d384SViktor Prutyanov     uint32_t unknown1;
1013fa2d384SViktor Prutyanov     PDB_SYMBOL_RANGE range;
1023fa2d384SViktor Prutyanov     uint16_t flag;
1033fa2d384SViktor Prutyanov     uint16_t file;
1043fa2d384SViktor Prutyanov     uint32_t symbol_size;
1053fa2d384SViktor Prutyanov     uint32_t lineno_size;
1063fa2d384SViktor Prutyanov     uint32_t unknown2;
1073fa2d384SViktor Prutyanov     uint32_t nSrcFiles;
1083fa2d384SViktor Prutyanov     uint32_t attribute;
1093fa2d384SViktor Prutyanov     char filename[1];
1103fa2d384SViktor Prutyanov } PDB_SYMBOL_FILE;
1113fa2d384SViktor Prutyanov 
1123fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_FILE_EX {
1133fa2d384SViktor Prutyanov     uint32_t unknown1;
1143fa2d384SViktor Prutyanov     PDB_SYMBOL_RANGE_EX range;
1153fa2d384SViktor Prutyanov     uint16_t flag;
1163fa2d384SViktor Prutyanov     uint16_t file;
1173fa2d384SViktor Prutyanov     uint32_t symbol_size;
1183fa2d384SViktor Prutyanov     uint32_t lineno_size;
1193fa2d384SViktor Prutyanov     uint32_t unknown2;
1203fa2d384SViktor Prutyanov     uint32_t nSrcFiles;
1213fa2d384SViktor Prutyanov     uint32_t attribute;
1223fa2d384SViktor Prutyanov     uint32_t reserved[2];
1233fa2d384SViktor Prutyanov     char filename[1];
1243fa2d384SViktor Prutyanov } PDB_SYMBOL_FILE_EX;
1253fa2d384SViktor Prutyanov 
1263fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_SOURCE {
1273fa2d384SViktor Prutyanov     uint16_t nModules;
1283fa2d384SViktor Prutyanov     uint16_t nSrcFiles;
1293fa2d384SViktor Prutyanov     uint16_t table[1];
1303fa2d384SViktor Prutyanov } PDB_SYMBOL_SOURCE;
1313fa2d384SViktor Prutyanov 
1323fa2d384SViktor Prutyanov typedef struct PDB_SYMBOL_IMPORT {
1333fa2d384SViktor Prutyanov     uint32_t unknown1;
1343fa2d384SViktor Prutyanov     uint32_t unknown2;
1353fa2d384SViktor Prutyanov     uint32_t TimeDateStamp;
1363fa2d384SViktor Prutyanov     uint32_t Age;
1373fa2d384SViktor Prutyanov     char filename[1];
1383fa2d384SViktor Prutyanov } PDB_SYMBOL_IMPORT;
1393fa2d384SViktor Prutyanov 
1403fa2d384SViktor Prutyanov typedef struct PDB_SYMBOLS_OLD {
1413fa2d384SViktor Prutyanov     uint16_t hash1_file;
1423fa2d384SViktor Prutyanov     uint16_t hash2_file;
1433fa2d384SViktor Prutyanov     uint16_t gsym_file;
1443fa2d384SViktor Prutyanov     uint16_t pad;
1453fa2d384SViktor Prutyanov     uint32_t module_size;
1463fa2d384SViktor Prutyanov     uint32_t offset_size;
1473fa2d384SViktor Prutyanov     uint32_t hash_size;
1483fa2d384SViktor Prutyanov     uint32_t srcmodule_size;
1493fa2d384SViktor Prutyanov } PDB_SYMBOLS_OLD;
1503fa2d384SViktor Prutyanov 
1513fa2d384SViktor Prutyanov typedef struct PDB_SYMBOLS {
1523fa2d384SViktor Prutyanov     uint32_t signature;
1533fa2d384SViktor Prutyanov     uint32_t version;
1543fa2d384SViktor Prutyanov     uint32_t unknown;
1553fa2d384SViktor Prutyanov     uint32_t hash1_file;
1563fa2d384SViktor Prutyanov     uint32_t hash2_file;
1573fa2d384SViktor Prutyanov     uint16_t gsym_file;
1583fa2d384SViktor Prutyanov     uint16_t unknown1;
1593fa2d384SViktor Prutyanov     uint32_t module_size;
1603fa2d384SViktor Prutyanov     uint32_t offset_size;
1613fa2d384SViktor Prutyanov     uint32_t hash_size;
1623fa2d384SViktor Prutyanov     uint32_t srcmodule_size;
1633fa2d384SViktor Prutyanov     uint32_t pdbimport_size;
1643fa2d384SViktor Prutyanov     uint32_t resvd0;
1653fa2d384SViktor Prutyanov     uint32_t stream_index_size;
1663fa2d384SViktor Prutyanov     uint32_t unknown2_size;
1673fa2d384SViktor Prutyanov     uint16_t resvd3;
1683fa2d384SViktor Prutyanov     uint16_t machine;
1693fa2d384SViktor Prutyanov     uint32_t resvd4;
1703fa2d384SViktor Prutyanov } PDB_SYMBOLS;
1713fa2d384SViktor Prutyanov 
1723fa2d384SViktor Prutyanov typedef struct {
1733fa2d384SViktor Prutyanov     uint16_t FPO;
1743fa2d384SViktor Prutyanov     uint16_t unk0;
1753fa2d384SViktor Prutyanov     uint16_t unk1;
1763fa2d384SViktor Prutyanov     uint16_t unk2;
1773fa2d384SViktor Prutyanov     uint16_t unk3;
1783fa2d384SViktor Prutyanov     uint16_t segments;
1793fa2d384SViktor Prutyanov } PDB_STREAM_INDEXES_OLD;
1803fa2d384SViktor Prutyanov 
1813fa2d384SViktor Prutyanov typedef struct {
1823fa2d384SViktor Prutyanov     uint16_t FPO;
1833fa2d384SViktor Prutyanov     uint16_t unk0;
1843fa2d384SViktor Prutyanov     uint16_t unk1;
1853fa2d384SViktor Prutyanov     uint16_t unk2;
1863fa2d384SViktor Prutyanov     uint16_t unk3;
1873fa2d384SViktor Prutyanov     uint16_t segments;
1883fa2d384SViktor Prutyanov     uint16_t unk4;
1893fa2d384SViktor Prutyanov     uint16_t unk5;
1903fa2d384SViktor Prutyanov     uint16_t unk6;
1913fa2d384SViktor Prutyanov     uint16_t FPO_EXT;
1923fa2d384SViktor Prutyanov     uint16_t unk7;
1933fa2d384SViktor Prutyanov } PDB_STREAM_INDEXES;
1943fa2d384SViktor Prutyanov 
1953fa2d384SViktor Prutyanov union codeview_symbol {
1963fa2d384SViktor Prutyanov     struct {
1973fa2d384SViktor Prutyanov         int16_t len;
1983fa2d384SViktor Prutyanov         int16_t id;
1993fa2d384SViktor Prutyanov     } generic;
2003fa2d384SViktor Prutyanov 
2013fa2d384SViktor Prutyanov     struct {
2023fa2d384SViktor Prutyanov         int16_t len;
2033fa2d384SViktor Prutyanov         int16_t id;
2043fa2d384SViktor Prutyanov         uint32_t symtype;
2053fa2d384SViktor Prutyanov         uint32_t offset;
2063fa2d384SViktor Prutyanov         uint16_t segment;
2073fa2d384SViktor Prutyanov         char name[1];
2083fa2d384SViktor Prutyanov     } public_v3;
2093fa2d384SViktor Prutyanov };
2103fa2d384SViktor Prutyanov 
2113fa2d384SViktor Prutyanov #define S_PUB_V3        0x110E
2123fa2d384SViktor Prutyanov 
2133fa2d384SViktor Prutyanov typedef struct pdb_seg {
2143fa2d384SViktor Prutyanov     uint32_t dword[8];
2153fa2d384SViktor Prutyanov } __attribute__ ((packed)) pdb_seg;
2163fa2d384SViktor Prutyanov 
2173fa2d384SViktor Prutyanov #define IMAGE_FILE_MACHINE_I386 0x014c
2183fa2d384SViktor Prutyanov #define IMAGE_FILE_MACHINE_AMD64 0x8664
2193fa2d384SViktor Prutyanov 
2203fa2d384SViktor Prutyanov struct pdb_reader {
2214ea1a21dSViktor Prutyanov     GMappedFile *gmf;
2223fa2d384SViktor Prutyanov     size_t file_size;
2233fa2d384SViktor Prutyanov     struct {
2243fa2d384SViktor Prutyanov         PDB_DS_HEADER *header;
2253fa2d384SViktor Prutyanov         PDB_DS_TOC *toc;
2263fa2d384SViktor Prutyanov         PDB_DS_ROOT *root;
2273fa2d384SViktor Prutyanov     } ds;
2283fa2d384SViktor Prutyanov     uint32_t file_used[1024];
2293fa2d384SViktor Prutyanov     PDB_SYMBOLS *symbols;
230231f6a7dSViktor Prutyanov     uint16_t segments;
2313fa2d384SViktor Prutyanov     uint8_t *modimage;
2323fa2d384SViktor Prutyanov     char *segs;
2333fa2d384SViktor Prutyanov     size_t segs_size;
2343fa2d384SViktor Prutyanov };
2353fa2d384SViktor Prutyanov 
236*b1250455SAkihiko Odaki bool pdb_init_from_file(const char *name, struct pdb_reader *reader);
2373fa2d384SViktor Prutyanov void pdb_exit(struct pdb_reader *reader);
2383fa2d384SViktor Prutyanov uint64_t pdb_resolve(uint64_t img_base, struct pdb_reader *r, const char *name);
2393fa2d384SViktor Prutyanov uint64_t pdb_find_public_v3_symbol(struct pdb_reader *reader, const char *name);
2403fa2d384SViktor Prutyanov 
2413fa2d384SViktor Prutyanov #endif /* PDB_H */
242