Fresh IDE . Diff
Not logged in

This repository is a mirror!

The original is located on: https://fresh.flatassembler.net/fossil/repo/fresh
If you want to follow the project, please update your remote-url

Differences From Artifact [5348678e52]:

To Artifact [3ba7101318]:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16




17
18
19


20
21
22
23
24
25
26
27

28
29
30
31
32
33
34
35
36





















37

38
39
40
41
42
43
44









45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

61
62
63
64






65
66
67
68
69
70
71

72
73
74
75





76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

93
94
95




96
97
98
99
100
101





102
103
104
105
106
107

108
109
110



111
112
113
114
115
116
117
118

119
120
121

122
123
124
125
126
127
128

1
2
3
4
5
6
7
8
9
10
11
12
13



14
15
16
17
18


19
20
21
22
23
24
25
26
27

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

59
60
61
62
63
64


65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90




91
92
93
94
95
96
97
98
99
100
101
102
103
104




105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127



128
129
130
131
132
133
134
135


136
137
138
139
140
141
142
143
144
145
146
147



148
149
150
151







152



153
154
155
156
157
158
159
160
161













-
-
-
+
+
+
+

-
-
+
+







-
+









+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+





-
-
+
+
+
+
+
+
+
+
+
















+
-
-
-
-
+
+
+
+
+
+







+
-
-
-
-
+
+
+
+
+

















+
-
-
-
+
+
+
+




-
-
+
+
+
+
+






+
-
-
-
+
+
+

-
-
-
-
-
-
-
+
-
-
-
+







+
; macroinstruction for importing functions in Linux

include '_elf.inc'

macro interpreter [library]
{
 db library,0
}

; creates symbols list with needed libraries.
macro import_proto library, [name, arg]
{
  common
    local str
    match needed,needed@dynamic \{ define needed@dynamic needed, str:library \}
    match ,needed@dynamic \{ define needed@dynamic str:library \}
    local str, cnt, use
    match needed,needed@dynamic \{ define needed@dynamic needed, str:cnt:use:library \}
    match ,needed@dynamic \{ define needed@dynamic str:cnt:use:library \}

  forward
    match imported, imported@dynamic \{ imported@dynamic equ imported, name \}
    match ,imported@dynamic \{ imported@dynamic equ name \}
    match imported, imported@dynamic \{ imported@dynamic equ imported, cnt:name \}
    match ,imported@dynamic \{ imported@dynamic equ cnt:name \}
    define name#@arg arg
}
define needed@dynamic
define imported@dynamic



macro define_import_arguments name, [argument] {
macro __define_import_arguments_var name, args {
common
  virtual at ebp+8
forward
    name#argument dd ?
common
  end virtual
}


macro __define_import_arguments name {
common
  if name#@arg eq VOID
    .__info.argtype=1
  else
    if name#@arg eq NONE
      .__info.argtype = 0
    else
      __define_import_arguments_var name, name#@arg
      .__info.argtype = 2
    end if
  end if
}



struc def_name name {
  db `name, 0
}


macro __do_import [name]
macro __do_import [cntandname]
{
common
  local strtab,strsz,symtab,rel,relsz,hash
  segment dynamic readable

  match needed,needed@dynamic \{
    irp item, needed \\{ match str:library,item \\\{ dd DT_NEEDED,str-strtab \\\} \\}
  match needed, needed@dynamic \{
    irp item, needed \\{
      match str:cnt:use:library, item \\\{
        cnt = 0
        if use > 0
          dd DT_NEEDED, str-strtab
        end if
      \\\}
    \\}
  \}

  dd DT_STRTAB, strtab
  dd DT_STRSZ, strsz
  dd DT_SYMTAB, symtab
  dd DT_SYMENT, sizeof.Elf32_Sym
  dd DT_REL, rel
  dd DT_RELSZ, relsz
  dd DT_RELENT, sizeof.Elf32_Rel
  dd DT_HASH, hash
  dd DT_NULL, 0

  segment readable writeable
  symtab: Elf32_Sym

forward
  match cnt:name, cntandname \{
  if used name
    local fstr
    Elf32_Sym fstr-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0
  end if
    if used name
      local fstr
      Elf32_Sym fstr-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0
      cnt = cnt + 1
    end if
  \}

common
  rel:
  local counter
  counter = 1

forward
  match cnt:name, cntandname \{
   if used name
     Elf32_Rel name, counter, R_386_32
     counter = counter + 1
   end if
    if used name
      Elf32_Rel name, counter, R_386_32
      counter = counter + 1
    end if
  \}

common
  relsz = $-rel
  hash:
  dd 1, counter
  dd 0

  repeat counter
   if %=counter
    dd 0
   else
    dd %
   end if
  end repeat
  strtab db 0

forward
  match cnt:name, cntandname \{
  if used name
    fstr db `name,0
  end if
    if used name
      fstr def_name name
    end if
  \}

common
  match needed, needed@dynamic \{
    irp item, needed \\{
      match str:library,item \\\{
        str db library,0
      match str:cnt:use:library,item \\\{
        use = cnt
        if use > 0
          str db library, 0
        end if
      \\\}
    \\}
  \}
  strsz = $-strtab

forward
  match cnt:name, cntandname \{
  if used name
    name dd 0
  end if
    if used name
      name dd 0
    end if

  if name#@arg eq VOID
    .__info.argtype=1
  else
    if name#@arg eq NONE
      .__info.argtype = 0
    else
      match args, name#@arg \{ define_import_arguments name, args \}
    __define_import_arguments name
      .__info.argtype = 2
    end if
  end if
  \}
}


macro ImportAll {
  match arguments, __do_import imported@dynamic \{ arguments \}
}