Qual è il formato (layout dati) dei file *.ni.dll.aux
trovati in C:\Windows\assembly\NativeImages_v4.0.30319_64
? Capisco che si tratta di file ausiliari generati da ngen.exe
. Quali dati contengono?Qual è il formato dei file `* .ni.dll.aux`?
risposta
analisi mostra che è un formato abbastanza semplice (come ha sottolineato Hans Passant). ha una parola tipo seguita da una parola lunghezza a 3 livelli: a livello di file, livello di record e livello di riferimento (questi sono termini arbitrari che sto usando per chiarezza).
questa è una panoramica:
[email protected]:~/stackoverflow/17681514$ ./job.py System.Net.ni.dll.aux
00000005 (00000204): 0b000000bc0000000d000000...00000000000000000000cccc
0000000b (000000bc): 0d0000005000000053797374...00000000000000000000cccc
0000000d: (00000050) 'System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\x00\xcc\xcc'
00000007: (00000004) '\t\x11\x00\x00'
00000002: (00000008) '\x00i,\x03c]\xcd\x01'
00000008: (00000014) '\xf3\xd8#\x08\xf7\x08\x9a$1\x11\xb8\x18Rv\[email protected]\xa1y\xb2.'
0000000a: (00000024) '\x011.0.23-106002268\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc'
00000004 (00000098): 010000004c0000006d73636f...00000000000000000000cccc
00000001: (0000004c) 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\x00'
00000003: (00000010) '\x9d\xa5\xbb3\xcd\x1c4\xb7\x85\x1c\x08\x8f\x0c\xf7I\xcc'
0000000a: (00000024) '\x011.0.23-106002119\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc'
00000004 (00000098): 010000004c00000053797374...00000000000000000000cccc
00000001: (0000004c) 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\x00\xcc\xcc'
00000003: (00000010) '\xe30[\xdb\xd0>\xf9\x19\x05\x1a\xa7\xf2x:\xc3*'
0000000a: (00000024) '\x011.0.23-106003331\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc'
ecco lo script (sviluppato incrementalmente) che scarica il sopra:
[email protected]:~/stackoverflow/17681514$ cat job.py
#!/usr/bin/python
import sys, os, struct
def dump(infile):
data = read(infile)
filelength = len(data)
filetype, length, data = next(data)
assert filelength == length + 8
print '%08x (%08x): %s' % (filetype, length, snippet(data))
lengthcheck = 8
while data:
recordtype, recordlength, data = next(data)
lengthcheck += 8 + recordlength
#debug('remaining data: %s' % snippet(data))
record, data = data[:recordlength], data[recordlength:]
print ' %08x (%08x): %s' % (recordtype, recordlength, snippet(record))
recordcheck = 0 # not 8 because record header was already not counted
while record:
subrecordtype, subrecordlength, record = next(record)
recordcheck += 8 + subrecordlength
datum, record = record[:subrecordlength], record[subrecordlength:]
print ' %08x: (%08x) %s' % (subrecordtype, subrecordlength, repr(datum))
assert recordcheck == recordlength
assert lengthcheck == filelength
def next(data):
'each chunk is a type word followed by a length word'
if not data:
typeword, length = 0, 0
elif len(data) > 16:
typeword = struct.unpack('<I', data[:4])[0]
length = struct.unpack('<I', data[4:8])[0]
else:
raise Exception('Invalid data length %d' % len(data))
return typeword, length, data[8:]
def read(filename):
input = open(filename, 'rb')
data = input.read()
input.close()
return data
def snippet(data):
snippet = data[:12].encode('hex')
if len(data) > 12:
snippet += '...'
if len(data) > 24:
snippet += data[-12:].encode('hex')
return snippet
def debug(message):
if __debug__:
if message:
print >>sys.stderr, message
return True
if __name__ == '__main__':
for infile in sys.argv[1:]:
dump(infile)
ogni record ha un tipo subrecord 0xa che sembra essere un numero di versione di sorta. il tipo di subrecord 0x3 potrebbe essere un GUID, solo a giudicare dalla sua lunghezza. i tipi 0x1 e 0xd sono descrittivi. Non ho idea di quali tipi di subrecord possano essere 0x7 e 0x2. forse 0x7 è un offset a 32 bit nel dll corrispondente, ma il numero a 64 bit nel tipo 0x2 non suggerisce nulla in particolare per me. digitare 0x8, 20 byte di lunghezza, potrebbe essere un tipo di hash. forse altri possono riempire gli spazi vuoti.
valori di stringa, come si può vedere, terminano in 0x0 più 0xcccc. il tipo di record 0xa è per lo più dati di stringa, ma preceduto da un byte 0x1 e lunghezza fissa di 0x24, quindi viene riempito con 0x0 in più. altri tipi di record, ma non tutti, terminano anche in 0xcccc.
i file sono stati ottenuti da una ricerca su Google per "index.of dll.aux", e ha trovato qui: http://www.badelement.co.uk/Movies/Storage/Win-7-Pro_64/Windows/assembly/NativeImages_v4.0.30319_64/System.Net/d79a634a4d873717e2dab52d827ba985/
Non c'è molto in essa, solo un elenco di tutti gli assembly dipendenti con una lingua di dati ogni. Questo non è documentato da nessuna parte, potrebbe avere qualcosa a che fare con le ottimizzazioni di .NET 4.5, come l'ottimizzazione guidata del profilo. Che problema stai cercando di risolvere? –
Non è questo fuori tema? – dhein