A PDB egyetlen fájl, amely logikailag több alfájlból, úgynevezett streamekből áll. Úgy tervezték, hogy optimalizálja a PDB módosításának folyamatát, ahogyan azt a fordítások és inkrementális linkek végzik. A streamek eltávolíthatók, hozzáadhatók vagy kicserélhetők anélkül, hogy más streameket át kellene írni, és a streameket leíró metaadatok módosítása is minimálisra csökken.
A PDB fix méretű, általában 1K, 2K vagy 4K méretű oldalakba van rendezve, amelyeket 0-tól kezdve sorszámoznak.
Megjegyzés: Feltételezzük, hogy minden numerikus információ (pl., folyam- és oldalszámok) az Intel x86 alapú processzorok natív, little-endian formában tárolódnak. A pdbparse Python kód ezt a feltételezést teszi.
StreamEdit
A PDB-ben minden stream több oldalt foglal el, amelyek nem feltétlenül vannak sorszámozva. A folyamnak van egy száma és egy hossza. A folyam tartalma az oldalainak a folyam hosszára csonkolva összefűzött oldalai.
Metaadatok formátumaEdit
A PDB metaadatainak feladata az összes komponens folyam azonosítása, megadva az egyes folyamokra vonatkozó oldalak hosszát és sorrendjét. A streamek sorszámozása 0-val kezdődik. Van egy számozatlan gyökér stream is, amely tartalmazza a metaadatok egy részét.
HeaderEdit
A PDB egy fejléccel kezdődik, amely a következőkből áll:
- Signature, amely az adott formátum azonosítására és érvényesítésére szolgál. Az aláírás hossza az adott formátumtól függően változik.
- A fejléc többi része az aláírás által azonosított formátumtól függően változik.
A fejléc hosszabb lehet, mint egy oldal.
A Microsoft-eszközök két PDB formátumot használnak:
7Edit verzió
Az aláírás "Microsoft C/C++ MSF 7.00\r\n\x1ADS"
(32 bájt).
A fejléc maradéka a következőkből áll:
- Lapméret, 4 bájt.
- Allokációs tábla mutatója, 4 bájt. Ennek jelentése ismeretlen. Úgy tűnik, hogy van egy allokációs tábla, egy 65 536 bitből (8 192 bájt) álló tömb, amely a PDB végén található, és az 1 bit olyan oldalt jelent, amelyet nem használnak.
- A fájloldalak száma, 4 bájt.
- Root stream mérete, 4 bájt.
- rezervált, 4 bájt.
- A Root stream oldalszámlistájának oldalszáma. Nem magának a Root streamnek a helyét jelzi, csak annak a struktúrát tartalmazó oldalnak a helyét, amely az oldalaira mutat. Ezen az oldalon a Root stream oldalszám-lista jelzi azokat az oldalakat, ahol a Root stream tárolódik. Oldalanként 4 bájtot tartalmaz, ami elegendő a fenti Root stream méretének fedezésére.
Root streamEdit
A root stream leírja az összes PDB streamet, kezdve a stream 0-val. Tartalma a PDB formátum verziójától függően változik.
2. verzióSzerkesztés
A gyökérfolyam a következőkből áll:
- folyamok száma, 2 bájt.
- Tartalék, 2 bájt.
- Minden folyamhoz:
- folyam mérete, 4 bájt.
- Tartalék, 4 bájt.
- Minden folyamhoz:
- Folyam oldalszámlistája, oldalanként 2 bájt, elegendő a fenti folyammérethez.
7-es verzióSzerkesztés
A gyökérfolyam a következőkből áll:
- folyamszám, 4 bájt.
- Minden folyamhoz:
- folyam mérete, 4 bájt.
- Minden folyamhoz:
- Folyam oldalszámlistája, oldalanként 4 bájt, elegendő a fenti folyammérethez.
A folyam tartalmaEdit
A Microsoft eszközei különböző típusú információkat tárolnak különböző számú folyamban. Egyes folyamszámokhoz fix információtípus tartozik, más folyamokat pedig a fent említett fix típusú folyamokban azonosítanak.
Az 1. folyam annak ellenőrzésére szolgál, hogy a PDB ugyanaz a fájl-e, amelyre egy futtatható vagy objektumfájl folyamban hivatkoznak.
- Version, 4 bájt.
- időbélyegző, 4 bájt.
- Kor, 4 bájt. Ez az a szám, ahányszor módosították ezt a PDB-t a létrehozása óta.
- GUID, 16 bájt.
- A következő nevek teljes hossza, 4 bájt. Nulla végződésű karakterláncok követik.
A 2. és 4. folyam tartalmazza a típusokra vonatkozó információkat. A tényleges típusrekordok a programban használt típusokat határozzák meg. Ezeknek a rekordoknak a felépítése a Microsoft által biztosított cvinfo.h fájlban található. A rekordoknak kétféle változata van, mindegyiknek saját indexszámkészlete van: típusazonosítók és típusok; a 2. folyamban csak a típusok, a 4. folyamban csak a típusazonosítók tárolódnak. Az indexeket arra használjuk, hogy ezekre a rekordokra hivatkozzunk a szimbólumrekordokon és más típusrekordokon belül.
- A fejléc:
- Version, 4 bájt.
- A fejléc mérete, 4 bájt.
- Minimális és maximális (utolsó + 1) index a típusrekordokhoz (egyenként 4 bájt).
- A következő adatok mérete, 4 bájt, a folyam végéig.
- Hash információk:
- Stream szám, 2 bájt, 2 bájt kitöltéssel.
- Hash kulcs, 4 bájt.
- Buckets, 4 bájt.
- HashVals, TiOff és HashAdj, mindegyik egy offsetből és hosszból áll, mindegyik 4 bájt.
- Type records, változó hosszúságú, count = (maximum – minimum) a fenti fejlécből.
Stream 3 egy könyvtár más streamek számára. Megjegyzés, ez nincs jelen a 2. verzióban, sem a fordító által előállított PDB-ben. A folyam egy fejléccel kezdődik, amelyet úgy töltünk fel, hogy összesen 64 bájt legyen
Offset | Size | Name | Description | |
---|---|---|---|---|
0 | 4 | Signature | Header identifier, == 0xFFFFFFFFFF | |
4 | 4 | HeaderVersion | Version of the Header | |
8 | 4 | Age | ||
12 | 2 | snGSSyms | ||
14 | 2 | usVerAll |
union { struct { USHORT usVerPdbDllMin : 8; // minor version and USHORT usVerPdbDllMaj : 7; // major version and USHORT fNewVerFmt : 1; // flag telling us we have rbld stored elsewhere (high bit of original major version) } vernew; // that built this pdb last. struct { USHORT usVerPdbDllRbld: 4; USHORT usVerPdbDllMin : 7; USHORT usVerPdbDllMaj : 5; } verold; USHORT usVerAll; }; |
|
16 | 2 | 2 | snPSSyms | |
18 | 2 | usVerPdbDllBuild | a pdb dll verziójának építése, amely ezt a pdb-t legutóbb építette | |
20 | 2 | snSymRecs | ||
22 | 2 | VerPdbDllRBld | rbld a pdb dll verziója, amely ezt a pdb-t legutóbb építette | |
24 | 4 | cbGpModi | az rgmodi alfolyam mérete | |
28 | 4 | cbSC | a Section Contribution alfolyam mérete | |
32 | 4 | cbSecMap | szekciótérkép mérete | |
36 | 4 | cbFileInfo | fájlinformációs adatfolyam mérete | |
40 | 4 | cbTSMap | a Type Server Map alfolyam mérete | |
44 | 4 | iMFC | MFC Index | |
48 | 4 | cbDbgHdr | a folyam végéhez csatolt opcionális DbgHdr információ mérete | |
52 | 4 | cbECInfo | az EC alfolyam bájtjainak száma, vagy 0, ha nincs EC engedélyezve Mods | |
56 | 2 | flags |
struct _flags { USHORT fIncLink:1; // true if linked incrmentally (really just if ilink thunks are present) USHORT fStripped:1; // true if PDB::CopyTo stripped the private data out USHORT fCTypes:1; // true if this PDB is using CTypes. USHORT unused:13; // reserved, must be 0. } flags; |
|
58 | 2 | wMachine | Gépazonosító, ugyanaz, mint a COFF objektumformátumban használt, e.g., hex 8664 Intel x86 64-bites | |
60 | 4 | RESERVED | jövőbeli bővítés, 64 bájtra kitöltve |
- Modulinformáció, változó hosszúságú. Teljes méret a fenti fejlécben. Minden egyes, a linkelő által használt objektummodulhoz tartozik egy ilyen
- Opened, 4 bájt.
- Symbol info.
- Section number, 2 bájt + 2 bájt padding.
- Offset és size, egyenként 4 bájt.
- Flags, 4 bájt.
- Modulszám, 2 bájt + 2 bájt kitöltés.
- CRC-k a szakaszadatokhoz és a relokációs adatokhoz, egyenként 4 bájt.
- Flags, 2 bájt.
- Stream number, 2 bájt.
- Symbols size, 4 bájt.
- Régi és új sorszám infó mérete, egyenként 4 bájt.
- A forrásfájlok száma, 2 bájt + 2 bájt kitöltés.
- Offsets, 4 bájt.
- niSource és niCompiler, egyenként 4 bájt.
- Modul neve, nullával végződő byte string.
- Objekt neve, nullával végződő byte string.
- Tömörítés 4 byte többszörösére.
- Szekció hozzájárulások, szakaszcímek, file info, ts map és EC info. Méretük a fenti fejlécben található.
- Hibakereső fejléc,
- A régi keretmutató kihagyás, kivételek, javítások, objektumtérképek a forráshoz és a forrásból, szakaszfejlécek, Token Ring ID-k, Xdata, Pdata, új keretmutató kihagyás és szakaszfejléc eredet számai. Mindegyik 2 bájt.