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

Add support for TEXTREL and remapping text relocations.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • 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) */