Changeset 740

Show
Ignore:
Timestamp:
07/07/08 15:24:08 (3 months ago)
Author:
mwhitworth
Message:

Add support for TEXTREL and remapping text relocations.

Location:
Whitix/trunk/user/linker
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/user/linker/elf.h

    r7 r740  
    4545#define PT_DYNAMIC      2 
    4646#define PT_PHDR         6 
     47 
     48#define PROT_EXEC       1 
     49#define PROT_WRITE      2 
     50#define PROT_READ       4 
    4751 
    4852struct ElfProgHeader 
     
    120124        unsigned long* elfBuckets,*elfChains; 
    121125        struct ElfProgHeader* pHeaders; 
     126        DWORD textAddr, textLength; 
    122127        unsigned long phNum; 
    123128        int refs,initFlags; 
  • Whitix/trunk/user/linker/lib.h

    r216 r740  
    119119        { 
    120120                if (dynEntry->tag < DT_NUM) 
     121                { 
    121122                        dynamicInfo[dynEntry->tag]=dynEntry->val; 
    122                 else if (dynEntry->tag == DT_RELCOUNT) 
     123 
     124                        if (dynEntry->tag == DT_TEXTREL) 
     125                                dynamicInfo[DT_TEXTREL]=1; 
     126                }else if (dynEntry->tag == DT_RELCOUNT) 
    123127                        dynamicInfo[DT_RELCOUNT_IDX]=dynEntry->val; 
    124128 
  • Whitix/trunk/user/linker/load_lib.c

    r733 r740  
    102102} 
    103103 
    104 Elf_Addr DlGetDynamicAddress(struct ElfProgHeader* pHeaders, int numEntries, int* picLib) 
     104Elf_Addr DlGetAddresses(struct ElfProgHeader* pHeaders, int numEntries, int* picLib, DWORD* textAddr, DWORD* textLength) 
    105105{ 
    106106        int i; 
     
    115115                        /* Is it a position independent library? Most likely not. */ 
    116116                        *picLib=0; 
     117 
     118                if (pHeaders[i].type == PT_LOAD && pHeaders[i].segFlags == (PROT_EXEC | PROT_READ)) 
     119                { 
     120                        *textAddr=pHeaders[i].vAddr; 
     121                        *textLength=pHeaders[i].memSize; 
     122                } 
    117123        } 
    118124         
     
    150156                                                                 fd,                                                                                                    /* Backing file */ 
    151157                                                                 pHeaders[i].fileOffset-PAGE_OFFSET(pHeaders[i].vAddr),  /* File offset */ 
    152                                                                  mmapFlags);                                                                                    /* Flags */ 
     158                                                                 mmapFlags);                                                                    /* Flags */ 
    153159 
    154160                        if (!mapAddr) 
     
    227233        unsigned long dynEntries[DT_NUM+1]; 
    228234        int picLib=1; 
     235        DWORD textAddr, textLength; 
    229236 
    230237        /* Check if we've loaded this library into memory already. */ 
     
    246253         * has position independent code from here. 
    247254         */ 
    248         dynamicAddr=DlGetDynamicAddress(pHeaders, fileHeader.phEntries, &picLib); 
     255        dynamicAddr=DlGetAddresses(pHeaders, fileHeader.phEntries, &picLib, &textAddr, &textLength); 
    249256         
    250257        if (!dynamicAddr) 
     
    271278        ElfParseDynInfo((struct ElfDyn*)dynamicAddr,dynEntries,loadAddr); 
    272279 
    273         if (dynEntries[DT_TEXTREL]) 
    274         { 
    275                 link_puts("Todo: make pages writeable"); 
    276                 SysExit(0); 
    277         } 
    278  
    279280        entry=DlCreateResolveEntry(name, pHeaders, fileHeader.phEntries, loadAddr, dynamicAddr, dynEntries); 
     281 
     282        /* Fill in the rest of the structure. */ 
     283        entry->textAddr=entry->loadAddr+textAddr; 
     284        entry->textLength=textLength; 
    280285 
    281286        /* Initialize the global offset table (GOT) */ 
  • Whitix/trunk/user/linker/relocate.c

    r686 r740  
    235235        relocSize=resolve->dynamicInfo[DT_RELSZ]; 
    236236 
     237        /* May need to make text rewriteable before relocation */ 
     238        if (resolve->dynamicInfo[DT_TEXTREL]) 
     239        { 
     240                SysMemoryProtect(resolve->textAddr, resolve->textLength, 7); 
     241        } 
     242 
    237243        if (resolve->dynamicInfo[DT_REL] && !(resolve->initFlags & INIT_RELOCS_DONE)) 
    238244        { 
     
    255261                DlParseReloc(symbols,resolve->dynamicInfo[DT_JMPREL], resolve->dynamicInfo[DT_PLTRELSZ], DlDoLazyReloc); 
    256262                resolve->initFlags |= INIT_JMP_RELOCS_DONE; 
     263        } 
     264 
     265        /* May need to make text read-only again. */ 
     266        if (resolve->dynamicInfo[DT_TEXTREL]) 
     267        { 
     268                SysMemoryProtect(resolve->textAddr, resolve->textLength, 5); 
    257269        } 
    258270}