Subversion Repositories Kolibri OS

Rev

Rev 8097 | 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