Changeset 740
- Timestamp:
- 07/07/08 15:24:08 (3 months ago)
- Location:
- Whitix/trunk/user/linker
- Files:
-
- 4 modified
-
elf.h (modified) (2 diffs)
-
lib.h (modified) (1 diff)
-
load_lib.c (modified) (6 diffs)
-
relocate.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Whitix/trunk/user/linker/elf.h
r7 r740 45 45 #define PT_DYNAMIC 2 46 46 #define PT_PHDR 6 47 48 #define PROT_EXEC 1 49 #define PROT_WRITE 2 50 #define PROT_READ 4 47 51 48 52 struct ElfProgHeader … … 120 124 unsigned long* elfBuckets,*elfChains; 121 125 struct ElfProgHeader* pHeaders; 126 DWORD textAddr, textLength; 122 127 unsigned long phNum; 123 128 int refs,initFlags; -
Whitix/trunk/user/linker/lib.h
r216 r740 119 119 { 120 120 if (dynEntry->tag < DT_NUM) 121 { 121 122 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) 123 127 dynamicInfo[DT_RELCOUNT_IDX]=dynEntry->val; 124 128 -
Whitix/trunk/user/linker/load_lib.c
r733 r740 102 102 } 103 103 104 Elf_Addr DlGet DynamicAddress(struct ElfProgHeader* pHeaders, int numEntries, int* picLib)104 Elf_Addr DlGetAddresses(struct ElfProgHeader* pHeaders, int numEntries, int* picLib, DWORD* textAddr, DWORD* textLength) 105 105 { 106 106 int i; … … 115 115 /* Is it a position independent library? Most likely not. */ 116 116 *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 } 117 123 } 118 124 … … 150 156 fd, /* Backing file */ 151 157 pHeaders[i].fileOffset-PAGE_OFFSET(pHeaders[i].vAddr), /* File offset */ 152 mmapFlags); /* Flags */158 mmapFlags); /* Flags */ 153 159 154 160 if (!mapAddr) … … 227 233 unsigned long dynEntries[DT_NUM+1]; 228 234 int picLib=1; 235 DWORD textAddr, textLength; 229 236 230 237 /* Check if we've loaded this library into memory already. */ … … 246 253 * has position independent code from here. 247 254 */ 248 dynamicAddr=DlGet DynamicAddress(pHeaders, fileHeader.phEntries, &picLib);255 dynamicAddr=DlGetAddresses(pHeaders, fileHeader.phEntries, &picLib, &textAddr, &textLength); 249 256 250 257 if (!dynamicAddr) … … 271 278 ElfParseDynInfo((struct ElfDyn*)dynamicAddr,dynEntries,loadAddr); 272 279 273 if (dynEntries[DT_TEXTREL])274 {275 link_puts("Todo: make pages writeable");276 SysExit(0);277 }278 279 280 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; 280 285 281 286 /* Initialize the global offset table (GOT) */ -
Whitix/trunk/user/linker/relocate.c
r686 r740 235 235 relocSize=resolve->dynamicInfo[DT_RELSZ]; 236 236 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 237 243 if (resolve->dynamicInfo[DT_REL] && !(resolve->initFlags & INIT_RELOCS_DONE)) 238 244 { … … 255 261 DlParseReloc(symbols,resolve->dynamicInfo[DT_JMPREL], resolve->dynamicInfo[DT_PLTRELSZ], DlDoLazyReloc); 256 262 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); 257 269 } 258 270 }
