|
@@ -6,8 +6,13 @@ uses Classes, SysUtils, wasmlink, wasmbin, lebutils;
|
|
|
|
|
|
type
|
|
type
|
|
TSymbolType = (
|
|
TSymbolType = (
|
|
- st_Nochange, st_Hidden, st_Weak
|
|
|
|
|
|
+ st_Nochange,
|
|
|
|
+ st_Local, // 'L'
|
|
|
|
+ st_Weak, // 'W'
|
|
|
|
+ st_VisHidden, // 'H' visibility-local
|
|
|
|
+ st_VisDefault // 'D' visibility default (not-hidden)
|
|
);
|
|
);
|
|
|
|
+ TSymbolTypes = set of TSymbolType;
|
|
|
|
|
|
TSymbolConfigure = class(TObject)
|
|
TSymbolConfigure = class(TObject)
|
|
symname : string;
|
|
symname : string;
|
|
@@ -39,13 +44,28 @@ begin
|
|
Result:=st_Nochange
|
|
Result:=st_Nochange
|
|
else
|
|
else
|
|
case upCase(s[1]) of
|
|
case upCase(s[1]) of
|
|
- 'H','L': Result:=st_Hidden;
|
|
|
|
|
|
+ 'L': Result:=st_Local;
|
|
|
|
+ 'H': Result:=st_VisHidden;
|
|
'W': Result:=st_Weak;
|
|
'W': Result:=st_Weak;
|
|
|
|
+ 'D': Result:=st_VisDefault;
|
|
else
|
|
else
|
|
Result:=st_Nochange;
|
|
Result:=st_Nochange;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+function StrToSymTypes(const s: string): TSymbolTypes;
|
|
|
|
+var
|
|
|
|
+ i: integer;
|
|
|
|
+ tt : TSymbolType;
|
|
|
|
+begin
|
|
|
|
+ Result := [];
|
|
|
|
+ for i:=1 to length(s) do begin
|
|
|
|
+ tt := StrToSymType(s[i]);
|
|
|
|
+ if tt <> st_Nochange then
|
|
|
|
+ Include(Result, tt);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
|
|
procedure ReadSymbolsConf(src: TStream; dst: TStrings);
|
|
procedure ReadSymbolsConf(src: TStream; dst: TStrings);
|
|
begin
|
|
begin
|
|
@@ -64,6 +84,7 @@ var
|
|
ofs : Int64;
|
|
ofs : Int64;
|
|
v : string;
|
|
v : string;
|
|
tt : TSymbolType;
|
|
tt : TSymbolType;
|
|
|
|
+ tts : TSymbolTypes;
|
|
fl : LongWord;
|
|
fl : LongWord;
|
|
begin
|
|
begin
|
|
//en := st.Position+secsize;
|
|
//en := st.Position+secsize;
|
|
@@ -87,14 +108,22 @@ begin
|
|
|
|
|
|
if si.hasSymName then begin
|
|
if si.hasSymName then begin
|
|
v := syms.Values[si.symname];
|
|
v := syms.Values[si.symname];
|
|
- tt := StrToSymType(v);
|
|
|
|
-
|
|
|
|
fl := si.flags;
|
|
fl := si.flags;
|
|
- case tt of
|
|
|
|
- st_Hidden:
|
|
|
|
- si.flags := (si.flags or WASM_SYM_BINDING_LOCAL) and (not WASM_SYM_BINDING_WEAK) and (not WASM_SYM_UNDEFINED);
|
|
|
|
- st_Weak:
|
|
|
|
- si.flags := (si.flags or WASM_SYM_BINDING_WEAK) and (not WASM_SYM_BINDING_LOCAL)
|
|
|
|
|
|
+
|
|
|
|
+ tts := StrToSymTypes(v);
|
|
|
|
+ for tt:=Low(TSymbolType) to High(TSymbolType) do begin
|
|
|
|
+ if not (tt in tts) then continue;
|
|
|
|
+ writeln(tt);
|
|
|
|
+ case tt of
|
|
|
|
+ st_Local:
|
|
|
|
+ si.flags := (si.flags or WASM_SYM_BINDING_LOCAL) and (not WASM_SYM_BINDING_WEAK) and (not WASM_SYM_UNDEFINED);
|
|
|
|
+ st_VisDefault:
|
|
|
|
+ si.flags := (si.flags and not WASM_SYM_VISIBILITY_HIDDEN);
|
|
|
|
+ st_VisHidden:
|
|
|
|
+ si.flags := (si.flags or WASM_SYM_VISIBILITY_HIDDEN);
|
|
|
|
+ st_Weak:
|
|
|
|
+ si.flags := (si.flags or WASM_SYM_BINDING_WEAK) and (not WASM_SYM_BINDING_LOCAL)
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
if fl <> si.flags then begin
|
|
if fl <> si.flags then begin
|