Rev 8097 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8097 | Rev 8859 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2019-2020, Anton Krotov |
4 | Copyright (c) 2019-2021, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | MODULE ELF; |
8 | MODULE ELF; |
Line 9... | Line 9... | ||
9 | 9 | ||
Line 153... | Line 153... | ||
153 | 153 | ||
154 | LISTS.push(symtab, sym) |
154 | LISTS.push(symtab, sym) |
Line 155... | Line -... | ||
155 | END NewSym; |
- | |
156 | - | ||
157 | - | ||
158 | PROCEDURE HashStr (name: ARRAY OF CHAR): INTEGER; |
- | |
159 | VAR |
- | |
160 | i, h: INTEGER; |
- | |
161 | g: SET; |
- | |
162 | - | ||
163 | BEGIN |
- | |
164 | h := 0; |
- | |
165 | i := 0; |
- | |
166 | WHILE name[i] # 0X DO |
- | |
167 | h := h * 16 + ORD(name[i]); |
- | |
168 | g := BITS(h) * {28..31}; |
- | |
169 | h := ORD(BITS(h) / BITS(LSR(ORD(g), 24)) - g); |
- | |
170 | INC(i) |
- | |
171 | END |
- | |
172 | - | ||
173 | RETURN h |
- | |
174 | END HashStr; |
155 | END NewSym; |
175 | 156 | ||
176 | 157 | ||
Line 177... | Line 158... | ||
177 | PROCEDURE MakeHash (bucket, chain: CHL.INTLIST; symCount: INTEGER); |
158 | PROCEDURE MakeHash (bucket, chain: CHL.INTLIST; symCount: INTEGER); |
Line 327... | Line 308... | ||
327 | phdr[dyn].p_vaddr := BaseAdr + phdr[dyn].p_offset; |
308 | phdr[dyn].p_vaddr := BaseAdr + phdr[dyn].p_offset; |
328 | phdr[dyn].p_paddr := phdr[dyn].p_vaddr; |
309 | phdr[dyn].p_paddr := phdr[dyn].p_vaddr; |
Line 329... | Line 310... | ||
329 | 310 | ||
Line 330... | Line 311... | ||
330 | hashtab := CHL.CreateIntList(); |
311 | hashtab := CHL.CreateIntList(); |
331 | 312 | ||
332 | CHL.PushInt(hashtab, HashStr("")); |
313 | CHL.PushInt(hashtab, STRINGS.HashStr("")); |
333 | NewSym(CHL.PushStr(strtab, ""), 0, 0, 0X, 0X, 0X); |
314 | NewSym(CHL.PushStr(strtab, ""), 0, 0, 0X, 0X, 0X); |
334 | CHL.PushInt(hashtab, HashStr("dlopen")); |
315 | CHL.PushInt(hashtab, STRINGS.HashStr("dlopen")); |
335 | NewSym(CHL.PushStr(strtab, "dlopen"), 0, 0, 12X, 0X, 0X); |
316 | NewSym(CHL.PushStr(strtab, "dlopen"), 0, 0, 12X, 0X, 0X); |
Line 336... | Line 317... | ||
336 | CHL.PushInt(hashtab, HashStr("dlsym")); |
317 | CHL.PushInt(hashtab, STRINGS.HashStr("dlsym")); |
337 | NewSym(CHL.PushStr(strtab, "dlsym"), 0, 0, 12X, 0X, 0X); |
318 | NewSym(CHL.PushStr(strtab, "dlsym"), 0, 0, 12X, 0X, 0X); |
338 | 319 | ||
339 | IF so THEN |
320 | IF so THEN |
340 | item := program.exp_list.first; |
321 | item := program.exp_list.first; |
341 | WHILE item # NIL DO |
322 | WHILE item # NIL DO |
342 | ASSERT(CHL.GetStr(program.export, item(BIN.EXPRT).nameoffs, Name)); |
323 | ASSERT(CHL.GetStr(program.export, item(BIN.EXPRT).nameoffs, Name)); |
343 | CHL.PushInt(hashtab, HashStr(Name)); |
324 | CHL.PushInt(hashtab, STRINGS.HashStr(Name)); |
344 | NewSym(CHL.PushStr(strtab, Name), item(BIN.EXPRT).label, 0, 12X, 0X, 0X); |
325 | NewSym(CHL.PushStr(strtab, Name), item(BIN.EXPRT).label, 0, 12X, 0X, 0X); |
345 | item := item.next |
326 | item := item.next |