Fresh IDE . Artifact [458d0939b1]
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

Artifact 458d0939b169a3af51ef3ab3ed4046930a28d658:


; 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 \}
  forward
    match imported, imported@dynamic \{ imported@dynamic equ imported, name \}
    match ,imported@dynamic \{ imported@dynamic equ name \}
    define name#@arg arg
}
define needed@dynamic
define imported@dynamic



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


macro __do_import [name]
{
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 \\\} \\}
  \}

  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
  if used name
    local fstr
    Elf32_Sym fstr-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0
  end if

common
  rel:
  local counter
  counter = 1

forward
   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
  if used name
    fstr db `name,0
  end if

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

forward
  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 \}
      .__info.argtype = 2
    end if
  end if
}


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