@@ -183,7 +183,7 @@ int CProcessPrx::LoadSingleImport(PspModuleImport *pImport, u32 addr)
183
183
COutput ::Printf (LEVEL_DEBUG , "Found variable nid:0x%08X addr:0x%08X name:%s\n" ,
184
184
pLib -> vars [iLoop ].nid , pLib -> vars [iLoop ].addr , pLib -> vars [iLoop ].name );
185
185
varFixup = pLib -> vars [iLoop ].addr ;
186
- while (varData = m_vMem .GetU32 (varFixup ))
186
+ while (( varData = m_vMem .GetU32 (varFixup ) ))
187
187
{
188
188
COutput ::Printf (LEVEL_DEBUG , "Variable Fixup: addr:%08X type:%08X\n" ,
189
189
(varData & 0x3FFFFFF ) << 2 , varData >> 26 );
@@ -835,7 +835,7 @@ bool CProcessPrx::ElfToPrx(FILE *fp)
835
835
/* Only modify normal elf relocation tables */
836
836
if (m_pElfSections [iLoop ].iType == SHT_REL )
837
837
{
838
- int iRelLoop ;
838
+ u32 iRelLoop ;
839
839
Elf32_Rel * reloc ;
840
840
841
841
reloc = (Elf32_Rel * ) (pElfCopy + m_pElfSections [iLoop ].iOffset );
@@ -851,7 +851,7 @@ bool CProcessPrx::ElfToPrx(FILE *fp)
851
851
852
852
if ((m_elfHeader .iShoff > 0 ) && (m_elfHeader .iShnum > 0 ) && (m_elfHeader .iShentsize > 0 ))
853
853
{
854
- int i ;
854
+ u32 i ;
855
855
pSection = (Elf32_Shdr * ) (pElfCopy + m_elfHeader .iShoff );
856
856
857
857
for (i = 0 ; i < m_elfHeader .iShnum ; i ++ )
@@ -1026,6 +1026,27 @@ void CProcessPrx::FreeImms(ImmMap &imms)
1026
1026
}
1027
1027
}
1028
1028
1029
+ static int reloc_sort (const void * rel1 , const void * rel2 )
1030
+ {
1031
+ const ElfReloc * pRel1 , * pRel2 ;
1032
+ int r1base , r2base ;
1033
+
1034
+ pRel1 = static_cast < const ElfReloc * > (rel1 );
1035
+ pRel2 = static_cast < const ElfReloc * > (rel2 );
1036
+ r1base = pRel1 -> symbol & 0xFF ;
1037
+ r2base = pRel2 -> symbol & 0xFF ;
1038
+
1039
+ /* First sort by program header */
1040
+ if (r1base != r2base )
1041
+ {
1042
+ return r1base - r2base ;
1043
+ }
1044
+
1045
+ /* If same program header then sort by relative offset */
1046
+
1047
+ return pRel1 -> offset - pRel2 -> offset ;
1048
+ }
1049
+
1029
1050
void CProcessPrx ::FixupRelocs (u32 dwBase , ImmMap & imms )
1030
1051
{
1031
1052
struct RegEntry
@@ -1035,9 +1056,7 @@ void CProcessPrx::FixupRelocs(u32 dwBase, ImmMap &imms)
1035
1056
u32 * inst ;
1036
1057
};
1037
1058
1038
- ElfSection * pModInfoSect ;
1039
1059
int iLoop ;
1040
- u32 iVal ;
1041
1060
u32 * pData ;
1042
1061
RegEntry regs [32 ];
1043
1062
@@ -1059,6 +1078,9 @@ void CProcessPrx::FixupRelocs(u32 dwBase, ImmMap &imms)
1059
1078
return ;
1060
1079
}
1061
1080
1081
+ /* Sort the relocations, might work, might not */
1082
+ qsort (m_pElfRelocs , m_iRelocCount , sizeof (ElfReloc ), reloc_sort );
1083
+
1062
1084
pData = NULL ;
1063
1085
for (iLoop = 0 ; iLoop < m_iRelocCount ; iLoop ++ )
1064
1086
{
@@ -1245,7 +1267,7 @@ static void print_row(FILE *fp, const u32* row, s32 row_size, u32 addr)
1245
1267
1246
1268
void CProcessPrx ::DumpData (FILE * fp , u32 dwAddr , u32 iSize , unsigned char * pData )
1247
1269
{
1248
- int i ;
1270
+ u32 i ;
1249
1271
u32 row [16 ];
1250
1272
int row_size ;
1251
1273
@@ -1354,7 +1376,7 @@ bool CProcessPrx::ReadString(u32 dwAddr, std::string &str, bool unicode)
1354
1376
1355
1377
void CProcessPrx ::DumpStrings (FILE * fp , u32 dwAddr , u32 iSize , unsigned char * pData )
1356
1378
{
1357
- int i ;
1379
+ u32 i ;
1358
1380
std ::string curr = "" ;
1359
1381
int iPrintHead = 0 ;
1360
1382
u32 dwRealLen = 0 ;
@@ -1409,7 +1431,7 @@ void CProcessPrx::DumpStrings(FILE *fp, u32 dwAddr, u32 iSize, unsigned char *pD
1409
1431
1410
1432
void CProcessPrx ::Disasm (FILE * fp , u32 dwAddr , u32 iSize , unsigned char * pData , ImmMap & imms , u32 dwBase )
1411
1433
{
1412
- int iILoop ;
1434
+ u32 iILoop ;
1413
1435
u32 * pInst ;
1414
1436
pInst = (u32 * ) pData ;
1415
1437
@@ -1427,8 +1449,8 @@ void CProcessPrx::Disasm(FILE *fp, u32 dwAddr, u32 iSize, unsigned char *pData,
1427
1449
fprintf (fp , "; Subroutine %s - Address 0x%08X " , s -> name .c_str (), dwAddr );
1428
1450
if (s -> alias .size () > 0 )
1429
1451
{
1430
- fprintf (fp , "- Aliases: " , s -> alias . size () );
1431
- int i ;
1452
+ fprintf (fp , "- Aliases: " );
1453
+ u32 i ;
1432
1454
for (i = 0 ; i < s -> alias .size ()- 1 ; i ++ )
1433
1455
{
1434
1456
fprintf (fp , "%s, " , s -> alias [i ].c_str ());
@@ -1447,7 +1469,7 @@ void CProcessPrx::Disasm(FILE *fp, u32 dwAddr, u32 iSize, unsigned char *pData,
1447
1469
1448
1470
if (s -> refs .size () > 0 )
1449
1471
{
1450
- int i ;
1472
+ u32 i ;
1451
1473
fprintf (fp , "\t\t; Refs: " );
1452
1474
for (i = 0 ; i < s -> refs .size (); i ++ )
1453
1475
{
@@ -1585,7 +1607,7 @@ void CProcessPrx::Dump(bool blAll, FILE *fp, const char *disopts, u32 dwBase)
1585
1607
{
1586
1608
if (m_pElfSections [iLoop ].iFlags & SHF_EXECINSTR )
1587
1609
{
1588
- int iILoop ;
1610
+ u32 iILoop ;
1589
1611
u32 dwAddr ;
1590
1612
u32 * pInst ;
1591
1613
dwAddr = m_pElfSections [iLoop ].iAddr ;
0 commit comments