Flat Assembler "Export" Macro with Custom Ordinal Base
2011-12-09 10:47:00
I have recently come across the need to build dynamic link libraries with custom ordinal base (different from 1). After searching the net and seeing lots of people writing their own export macros, I came to a conclusion that Occam's Razor principle still works here and decided to make simple modifications to the original export macro provided with FASM package. The modifications are marked with red.
; Macroinstruction for making export section macro export dllname, ordinalbase, [label, string] { common local module,addresses,names,ordinal,count count = 0 forward count = count+1 common dd 0,0,0,RVA module, ordinalbase dd count,count,RVA addresses,RVA names,RVA ordinal addresses: forward dd RVA label common names: forward local name dd RVA name common ordinal: count = 0 forward dw count count = count+1 common module db dllname,0 forward name db string,0 common local x,y,z,str1,str2,v1,v2 x = count shr 1 while x > 0 y = x while y < count z = y while z-x >= 0 load v1 dword from names+z*4 str1=($-RVA $)+v1 load v2 dword from names+(z-x)*4 str2=($-RVA $)+v2 while v1 > 0 load v1 from str1+%-1 load v2 from str2+%-1 if v1 <> v2 break end if end while if v1<v2 load v1 dword from names+z*4 load v2 dword from names+(z-x)*4 store dword v1 at names+(z-x)*4 store dword v2 at names+z*4 load v1 word from ordinal+z*2 load v2 word from ordinal+(z-x)*2 store word v1 at ordinal+(z-x)*2 store word v2 at ordinal+z*2 else break end if z = z-x end while y = y+1 end while x = x shr 1 end while }
As simple as that.
Hope this note may help someone.