diff --git a/tools/readself/elf64.pas b/tools/readself/elf64.pas index ea633528..3fd3bedd 100644 --- a/tools/readself/elf64.pas +++ b/tools/readself/elf64.pas @@ -441,20 +441,26 @@ const type TModuleValue=packed record case Byte of - 0:(value:Int64); + 0:(value :Int64); 1:(name_offset:DWORD; - version_minor:Byte; - version_major:Byte; - id:Word); + version :Word; + id :Word); end; TLibraryValue=packed record case Byte of - 0:(value:Int64); + 0:(value :Int64); 1:(name_offset:DWORD; - version_minor:Byte; - version_major:Byte; - id:Word); + version :Word; + id :Word); + end; + + TLibraryAttr=packed record + case Byte of + 0:(value:Int64); + 1:(attr :WORD; + align:DWORD; + id :Word); end; PTLS_index=^TLS_index; diff --git a/tools/readself/readself.lpr b/tools/readself/readself.lpr index e7c85fa4..bcbc4523 100644 --- a/tools/readself/readself.lpr +++ b/tools/readself/readself.lpr @@ -341,6 +341,13 @@ begin end; end; +function get_sdk_version_str(version:QWORD):RawByteString; +begin + Result:=Format('%.*x.%.*x.%.*x',[2,(version shr 24), + 3,((version shr 12) and $fff), + 3,(version and $fff)]); +end; + procedure print_self_authinfo(obj:p_elf_obj); label _not_exist; @@ -372,8 +379,8 @@ begin Writeln(' AuthorityID :0x',HexStr(authinfo^.AuthorityID,16)); Writeln(' Program_Type :0x',HexStr(authinfo^.Program_Type,2),' ',get_program_type_str(authinfo^.Program_Type)); - Writeln(' Program_Version:0x',HexStr(authinfo^.Program_Version,16)); - Writeln(' System_Version :0x',HexStr(authinfo^.System_Version,16)); + Writeln(' Program_Version:',get_sdk_version_str(authinfo^.Program_Version)); + Writeln(' System_Version :',get_sdk_version_str(authinfo^.System_Version )); Write (' Digest_SHA_256 :'); print_bytes(@authinfo^.Digest_SHA_256,32); @@ -939,7 +946,7 @@ var entry:p_elf64_dyn; i,count:Integer; mu:TModuleValue; - lu:TLibraryValue; + la:TLibraryAttr; str:PAnsiChar; begin if (obj^.dyn_addr<>nil) then @@ -983,8 +990,8 @@ begin DT_SCE_EXPORT_LIB_ATTR, DT_SCE_IMPORT_LIB_ATTR: begin - lu.value:=entry^.d_un.d_val; - Write(mu.id:2,':',get_lib_attr_str(lu.name_offset)); + la.value:=entry^.d_un.d_val; + Write(la.id:2,':',get_lib_attr_str(la.attr)); end; DT_SCE_FINGERPRINT: @@ -1203,8 +1210,8 @@ end; function get_st_shndx_str(st_shndx:Word):RawByteString; begin case st_shndx of - SHN_UNDEF :Result:='SHN_UNDEF'; - else Result:='0x'+HexStr(st_shndx,4)+' '; + SHN_UNDEF :Result:='UNDEF'; + else Result:='0x'+HexStr(st_shndx,3); end; end; @@ -1226,7 +1233,7 @@ begin Writeln('Symbol table ''.symtab'':0x',HexStr(s,8),'..0x',HexStr(e,8),':',(e-s)); - Writeln(' Num Value Size Type Bind Vis Ndx Name'); + Writeln(' Num Value Size Type Bind Vis Ndx Name'); if (count<>0) then For i:=0 to count-1 do begin @@ -1607,7 +1614,7 @@ begin if (Pointer(@pa^.Size )+SizeOf(pa^.Size )<=pe) then Writeln(' Size :0x',HexStr(pa^.Size ,8)); if (Pointer(@pa^.Magic )+SizeOf(pa^.Magic )<=pe) then Writeln(' Magic :0x',HexStr(pa^.Magic ,8)); if (Pointer(@pa^.Entry_count )+SizeOf(pa^.Entry_count )<=pe) then Writeln(' Entry_count :0x',HexStr(pa^.Entry_count ,8)); - if (Pointer(@pa^.SDK_version )+SizeOf(pa^.SDK_version )<=pe) then Writeln(' SDK_version :0x',HexStr(pa^.SDK_version ,8)); + if (Pointer(@pa^.SDK_version )+SizeOf(pa^.SDK_version )<=pe) then Writeln(' SDK_version :',get_sdk_version_str(pa^.SDK_version)); if (Pointer(@pa^.sceProcessName )+SizeOf(pa^.sceProcessName )<=pe) then WOfsstr(' sceProcessName :',@pa^.sceProcessName ,obj); if (Pointer(@pa^.sceUserMainThreadName )+SizeOf(pa^.sceUserMainThreadName )<=pe) then WOfsstr(' sceUserMainThreadName :',@pa^.sceUserMainThreadName ,obj); if (Pointer(@pa^.sceUserMainThreadPriority )+SizeOf(pa^.sceUserMainThreadPriority )<=pe) then WOfsDwr(' sceUserMainThreadPriority :',@pa^.sceUserMainThreadPriority ,obj); @@ -1645,7 +1652,7 @@ begin if (Pointer(@pa^.Size )+SizeOf(pa^.Size )<=pe) then Writeln(' Size :0x',HexStr(pa^.Size ,8)); if (Pointer(@pa^.Magic )+SizeOf(pa^.Magic )<=pe) then Writeln(' Magic :0x',HexStr(pa^.Magic ,8)); - if (Pointer(@pa^.SDK_version)+SizeOf(pa^.SDK_version)<=pe) then Writeln(' SDK_version:0x',HexStr(pa^.SDK_version,8)); + if (Pointer(@pa^.SDK_version)+SizeOf(pa^.SDK_version)<=pe) then Writeln(' SDK_version:',get_sdk_version_str(pa^.SDK_version)); end else begin Writeln('SCE module param:','not exist');