Как стать автором
Обновить

Комментарии 6

Не очень понятна применимость второй ссылки в контексте статьи
Это к тому, что Ваша статья в сто раз полезнее и нужнее, чем статья по моей второй ссылке. :-)
imitron, с сисколами все чудесно. А вот когда нам надо импорты использовать?
format ELF executable 3
entry start

include 'linux/x86.inc'

interpreter '/lib/ld-linux.so.2'
needed 'libX11.so.6'

include 'os_specs/linux/api/x86/libx11.inc'

segment readable executable
start:
cinvoke libx11.XOpenDisplay, 0
or eax, eax
jz .failXserver
mov [hdisplay], eax
cinvoke libx11.XDefaultScreen, eax
cinvoke libx11.XDefaultRootWindow, [hdisplay]
cinvoke libx11.XCreateSimpleWindow, [hdisplay], eax, 10, 20, 400, 200, 0, $000000, $D4D0C8
or eax, eax
jz .failCreateWindow
mov [hwnd], eax
cinvoke libx11.XSelectInput, [hdisplay], [hwnd], 0
cinvoke libx11.XStoreName, [hdisplay], [hwnd], _title
cinvoke libx11.XMapRaised, [hdisplay], [hwnd]
or eax, eax
jz .failShow
cinvoke libx11.XCreateGC, [hdisplay], [hwnd], 0, 0
mov [hGC], eax
cinvoke libx11.XSetForeground, [hdisplay], [hGC], $000000
cinvoke libx11.XSetBackground, [hdisplay], [hGC], $ffffff
.msg_pump:
cinvoke libx11.XNextEvent, [hdisplay], event
jmp .msg_pump
stdcall Xshutdown
.failShow:
.failCreateWindow:
.failXserver:
mov [con_handle],2
mov esi,_error
call display_string
mov al,-1
exit_program:
movzx ebx,al
lcall sys_exit,ebx
Xshutdown:
cinvoke libx11.XFreeGC, [hdisplay], [hGC]
cinvoke libx11.XDestroyWindow, [hwnd], [hdisplay]
cinvoke libx11.XSetErrorHandler, [oError]
xor eax, eax
retn

display_string:
push ebx
mov edi,esi
mov edx,esi
or ecx,-1
xor al,al
repne scasb
neg ecx
sub ecx,2
xchg ecx,edx
lcall sys_write,[con_handle],ecx,edx
pop ebx
retn

segment readable writeable
_title TCHAR 'Linux32 Xlib GUI program template',0
_error TCHAR 'Startup failed.',0
con_handle dd 0
oError dd 0
hGC dd 0
hwnd dd 0
hdisplay dd 0
event rd 132


макросы для 32битного импорта:
macro Elf32_Sym name,value,size,bind,type,other,shndx {
dd name+0
dd value+0
dd size+0
db bind+0 + type+0
db other+0
dw shndx+0 }

virtual at 0
Elf32_Sym
sizeof.Elf32_Sym = $
end virtual

macro Elf32_Rel offset,symbol,type
{
dd offset+0
dd (symbol+0) shl 8 + (type+0)
}

virtual at 0
Elf32_Rel
sizeof.Elf32_Rel = $
end virtual

macro Elf32_Rela offset,symbol,type,addend
{
dd offset+0
dd (symbol+0) shl 8 + (type+0)
dd addend+0
}

virtual at 0
Elf32_Rela
sizeof.Elf32_Rela = $
end virtual

macro interpreter [library] {
define interpreter@ library }

macro needed [library] {
local str
match needed,needed@dynamic \{ define needed@dynamic needed,str:library \}
match ,needed@dynamic \{ define needed@dynamic str:library \} }

define needed@dynamic

macro import [name,string] {
local str
match import,import@strtab \{ define import@strtab import,str:name:string \}
match ,import@strtab \{ define import@strtab str:name:string \} }

define import@strtab

postpone {
match library,interpreter@ \{
segment interpreter readable
db library,0 \}
match needed,needed@dynamic \{ match import,import@strtab \\{
segment dynamic readable
local strtab,strsz,symtab,rel,relsz,hash,counter
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
counter = 1
irp item,import \\\{
match fstr:name:string,item \\\\{
if used name
Elf32_Sym fstr-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0
end if \\\\} \\\}
rel:
irp item,import \\\{
match fstr:name:string,item \\\\{
if used name
Elf32_Rel name,counter,R_386_32
counter = counter+1
end if \\\\} \\\}
relsz = $-rel
hash:
dd 1,counter
;repeat bundlecounter
;if %=bundlecounter
dd 0
;else
;dd %
;end if
;end repeat
repeat counter
if %=counter
dd 0
else
dd %
end if
end repeat
strtab:
db '',0
irp item,import \\\{
match fstr:name:string,item \\\\{
if used name
fstr db string,0
end if \\\\} \\\}
irp item,needed \\\{
match str:library,item \\\\{
str db library,0 \\\\} \\\}
strsz = $-strtab
irp item,import \\\{
match fstr:name:string,item \\\\{
if used name
name dd 0
end if \\\\} \\\} \\} \} }



имеем на выходе:
db 7Fh, 45h, 4Ch, 46h, 01h, 01h, 01h, 03h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 02h, 00h, 03h, 00h, 01h, 00h, 00h, 00h, 0D4h, 80h, 04h, 08h, 34h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 34h, 00h, 20h, 00h, 05h, 00h, 28h, 00h
db 00h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 80h, 04h, 08h
db 00h, 80h, 04h, 08h, 0FBh, 02h, 00h, 00h, 0FBh, 02h, 00h, 00h, 05h, 00h, 00h, 00h
db 00h, 10h, 00h, 00h, 01h, 00h, 00h, 00h, 0FBh, 02h, 00h, 00h, 0FBh, 92h, 04h, 08h
db 0FBh, 92h, 04h, 08h, 46h, 00h, 00h, 00h, 56h, 02h, 00h, 00h, 06h, 00h, 00h, 00h
db 00h, 10h, 00h, 00h, 03h, 00h, 00h, 00h, 41h, 03h, 00h, 00h, 41h, 0A3h, 04h, 08h
db 41h, 0A3h, 04h, 08h, 13h, 00h, 00h, 00h, 13h, 00h, 00h, 00h, 04h, 00h, 00h, 00h
db 01h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 54h, 03h, 00h, 00h, 54h, 0A3h, 04h, 08h
db 54h, 0A3h, 04h, 08h, 50h, 00h, 00h, 00h, 50h, 00h, 00h, 00h, 04h, 00h, 00h, 00h
db 01h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 41h, 03h, 00h, 00h, 41h, 0A3h, 04h, 08h
db 41h, 0A3h, 04h, 08h, 11h, 03h, 00h, 00h, 11h, 03h, 00h, 00h, 06h, 00h, 00h, 00h
db 00h, 10h, 00h, 00h, 89h, 0E5h, 83h, 0ECh, 04h, 83h, 0E4h, 0F0h, 83h, 0C4h, 04h, 6Ah
db 00h, 0FFh, 15h, 3Ah, 0A6h, 04h, 08h, 89h, 0ECh, 09h, 0C0h, 0Fh, 84h, 6Eh, 01h, 00h
db 00h, 0A3h, 3Dh, 93h, 04h, 08h, 89h, 0E5h, 83h, 0ECh, 04h, 83h, 0E4h, 0F0h, 83h, 0C4h
db 04h, 50h, 0FFh, 15h, 26h, 0A6h, 04h, 08h, 89h, 0ECh, 89h, 0E5h, 83h, 0ECh, 04h, 83h
db 0E4h, 0F0h, 83h, 0C4h, 04h, 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh, 15h, 22h, 0A6h, 04h
db 08h, 89h, 0ECh, 89h, 0E5h, 83h, 0ECh, 24h, 83h, 0E4h, 0F0h, 83h, 0C4h, 24h, 68h, 0C8h
db 0D0h, 0D4h, 00h, 6Ah, 00h, 6Ah, 00h, 68h, 0C8h, 00h, 00h, 00h, 68h, 90h, 01h, 00h
db 00h, 6Ah, 14h, 6Ah, 0Ah, 50h, 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh, 15h, 1Eh, 0A6h
db 04h, 08h, 89h, 0ECh, 09h, 0C0h, 0Fh, 84h, 03h, 01h, 00h, 00h, 0A3h, 39h, 93h, 04h
db 08h, 89h, 0E5h, 83h, 0ECh, 0Ch, 83h, 0E4h, 0F0h, 83h, 0C4h, 0Ch, 6Ah, 00h, 0FFh, 35h
db 39h, 93h, 04h, 08h, 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh, 15h, 3Eh, 0A6h, 04h, 08h
db 89h, 0ECh, 89h, 0E5h, 83h, 0ECh, 0Ch, 83h, 0E4h, 0F0h, 83h, 0C4h, 0Ch, 68h, 0FBh, 92h
db 04h, 08h, 0FFh, 35h, 39h, 93h, 04h, 08h, 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh, 15h
db 4Eh, 0A6h, 04h, 08h, 89h, 0ECh, 89h, 0E5h, 83h, 0ECh, 08h, 83h, 0E4h, 0F0h, 83h, 0C4h
db 08h, 0FFh, 35h, 39h, 93h, 04h, 08h, 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh, 15h, 32h
db 0A6h, 04h, 08h, 89h, 0ECh, 09h, 0C0h, 0Fh, 84h, 92h, 00h, 00h, 00h, 89h, 0E5h, 83h
db 0ECh, 10h, 83h, 0E4h, 0F0h, 83h, 0C4h, 10h, 6Ah, 00h, 6Ah, 00h, 0FFh, 35h, 39h, 93h
db 04h, 08h, 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh, 15h, 1Ah, 0A6h, 04h, 08h, 89h, 0ECh
db 0A3h, 35h, 93h, 04h, 08h, 89h, 0E5h, 83h, 0ECh, 0Ch, 83h, 0E4h, 0F0h, 83h, 0C4h, 0Ch
db 6Ah, 00h, 0FFh, 35h, 35h, 93h, 04h, 08h, 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh, 15h
db 4Ah, 0A6h, 04h, 08h, 89h, 0ECh, 89h, 0E5h, 83h, 0ECh, 0Ch, 83h, 0E4h, 0F0h, 83h, 0C4h
db 0Ch, 68h, 0FFh, 0FFh, 0FFh, 00h, 0FFh, 35h, 35h, 93h, 04h, 08h, 0FFh, 35h, 3Dh, 93h
db 04h, 08h, 0FFh, 15h, 42h, 0A6h, 04h, 08h, 89h, 0ECh, 89h, 0E5h, 83h, 0ECh, 08h, 83h
db 0E4h, 0F0h, 83h, 0C4h, 08h, 68h, 41h, 93h, 04h, 08h, 0FFh, 35h, 3Dh, 93h, 04h, 08h
db 0FFh, 15h, 36h, 0A6h, 04h, 08h, 89h, 0ECh, 0EBh, 0E0h, 0E8h, 20h, 00h, 00h, 00h, 0C7h
db 05h, 2Dh, 93h, 04h, 08h, 02h, 00h, 00h, 00h, 0BEh, 1Dh, 93h, 04h, 08h, 0E8h, 66h
db 00h, 00h, 00h, 0B0h, 0FFh, 0Fh, 0B6h, 0D8h, 0B8h, 01h, 00h, 00h, 00h, 0CDh, 80h, 89h
db 0E5h, 83h, 0ECh, 08h, 83h, 0E4h, 0F0h, 83h, 0C4h, 08h, 0FFh, 35h, 35h, 93h, 04h, 08h
db 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh, 15h, 2Eh, 0A6h, 04h, 08h, 89h, 0ECh, 89h, 0E5h
db 83h, 0ECh, 08h, 83h, 0E4h, 0F0h, 83h, 0C4h, 08h, 0FFh, 35h, 3Dh, 93h, 04h, 08h, 0FFh
db 35h, 39h, 93h, 04h, 08h, 0FFh, 15h, 2Ah, 0A6h, 04h, 08h, 89h, 0ECh, 89h, 0E5h, 83h
db 0ECh, 04h, 83h, 0E4h, 0F0h, 83h, 0C4h, 04h, 0FFh, 35h, 31h, 93h, 04h, 08h, 0FFh, 15h
db 46h, 0A6h, 04h, 08h, 89h, 0ECh, 31h, 0C0h, 0C3h, 53h, 89h, 0F7h, 89h, 0F2h, 83h, 0C9h
db 0FFh, 30h, 0C0h, 0F2h, 0AEh, 0F7h, 0D9h, 83h, 0E9h, 02h, 87h, 0CAh, 8Bh, 1Dh, 2Dh, 93h
db 04h, 08h, 0B8h, 04h, 00h, 00h, 00h, 0CDh, 80h, 5Bh, 0C3h, 4Ch, 69h, 6Eh, 75h, 78h
db 33h, 32h, 20h, 58h, 6Ch, 69h, 62h, 20h, 47h, 55h, 49h, 20h, 70h, 72h, 6Fh, 67h
db 72h, 61h, 6Dh, 20h, 74h, 65h, 6Dh, 70h, 6Ch, 61h, 74h, 65h, 00h, 53h, 74h, 61h
db 72h, 74h, 75h, 70h, 20h, 66h, 61h, 69h, 6Ch, 65h, 64h, 2Eh, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 2Fh, 6Ch, 69h, 62h, 2Fh, 6Ch, 64h, 2Dh, 6Ch, 69h, 6Eh, 75h, 78h, 2Eh, 73h
db 6Fh, 2Eh, 32h, 00h, 01h, 00h, 00h, 00h, 0C2h, 00h, 00h, 00h, 05h, 00h, 00h, 00h
db 4Ch, 0A5h, 04h, 08h, 0Ah, 00h, 00h, 00h, 0CEh, 00h, 00h, 00h, 06h, 00h, 00h, 00h
db 0A4h, 0A3h, 04h, 08h, 0Bh, 00h, 00h, 00h, 10h, 00h, 00h, 00h, 11h, 00h, 00h, 00h
db 94h, 0A4h, 04h, 08h, 12h, 00h, 00h, 00h, 70h, 00h, 00h, 00h, 13h, 00h, 00h, 00h
db 08h, 00h, 00h, 00h, 04h, 00h, 00h, 00h, 04h, 0A5h, 04h, 08h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 0Bh, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 1Fh, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 32h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 41h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 50h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 58h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 63h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 6Eh, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 7Bh, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 88h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 97h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 0A8h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 0B7h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 12h, 00h, 00h, 00h, 1Ah, 0A6h, 04h, 08h, 01h, 01h, 00h, 00h, 1Eh, 0A6h, 04h, 08h
db 01h, 02h, 00h, 00h, 22h, 0A6h, 04h, 08h, 01h, 03h, 00h, 00h, 26h, 0A6h, 04h, 08h
db 01h, 04h, 00h, 00h, 2Ah, 0A6h, 04h, 08h, 01h, 05h, 00h, 00h, 2Eh, 0A6h, 04h, 08h
db 01h, 06h, 00h, 00h, 32h, 0A6h, 04h, 08h, 01h, 07h, 00h, 00h, 36h, 0A6h, 04h, 08h
db 01h, 08h, 00h, 00h, 3Ah, 0A6h, 04h, 08h, 01h, 09h, 00h, 00h, 3Eh, 0A6h, 04h, 08h
db 01h, 0Ah, 00h, 00h, 42h, 0A6h, 04h, 08h, 01h, 0Bh, 00h, 00h, 46h, 0A6h, 04h, 08h
db 01h, 0Ch, 00h, 00h, 4Ah, 0A6h, 04h, 08h, 01h, 0Dh, 00h, 00h, 4Eh, 0A6h, 04h, 08h
db 01h, 0Eh, 00h, 00h, 01h, 00h, 00h, 00h, 0Fh, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 01h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 03h, 00h, 00h, 00h, 04h, 00h, 00h, 00h
db 05h, 00h, 00h, 00h, 06h, 00h, 00h, 00h, 07h, 00h, 00h, 00h, 08h, 00h, 00h, 00h
db 09h, 00h, 00h, 00h, 0Ah, 00h, 00h, 00h, 0Bh, 00h, 00h, 00h, 0Ch, 00h, 00h, 00h
db 0Dh, 00h, 00h, 00h, 0Eh, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 58h, 43h, 72h
db 65h, 61h, 74h, 65h, 47h, 43h, 00h, 58h, 43h, 72h, 65h, 61h, 74h, 65h, 53h, 69h
db 6Dh, 70h, 6Ch, 65h, 57h, 69h, 6Eh, 64h, 6Fh, 77h, 00h, 58h, 44h, 65h, 66h, 61h
db 75h, 6Ch, 74h, 52h, 6Fh, 6Fh, 74h, 57h, 69h, 6Eh, 64h, 6Fh, 77h, 00h, 58h, 44h
db 65h, 66h, 61h, 75h, 6Ch, 74h, 53h, 63h, 72h, 65h, 65h, 6Eh, 00h, 58h, 44h, 65h
db 73h, 74h, 72h, 6Fh, 79h, 57h, 69h, 6Eh, 64h, 6Fh, 77h, 00h, 58h, 46h, 72h, 65h
db 65h, 47h, 43h, 00h, 58h, 4Dh, 61h, 70h, 52h, 61h, 69h, 73h, 65h, 64h, 00h, 58h
db 4Eh, 65h, 78h, 74h, 45h, 76h, 65h, 6Eh, 74h, 00h, 58h, 4Fh, 70h, 65h, 6Eh, 44h
db 69h, 73h, 70h, 6Ch, 61h, 79h, 00h, 58h, 53h, 65h, 6Ch, 65h, 63h, 74h, 49h, 6Eh
db 70h, 75h, 74h, 00h, 58h, 53h, 65h, 74h, 42h, 61h, 63h, 6Bh, 67h, 72h, 6Fh, 75h
db 6Eh, 64h, 00h, 58h, 53h, 65h, 74h, 45h, 72h, 72h, 6Fh, 72h, 48h, 61h, 6Eh, 64h
db 6Ch, 65h, 72h, 00h, 58h, 53h, 65h, 74h, 46h, 6Fh, 72h, 65h, 67h, 72h, 6Fh, 75h
db 6Eh, 64h, 00h, 58h, 53h, 74h, 6Fh, 72h, 65h, 4Eh, 61h, 6Dh, 65h, 00h, 6Ch, 69h
db 62h, 58h, 31h, 31h, 2Eh, 73h, 6Fh, 2Eh, 36h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h


где то глюк в макросах импорта, есть версия где?
Спасибо.
Я пока не настолько богоподобен чтобы отладить этот код в уме. Думаю придется посидеть в отладчике, чтобы разобраться где проблема
Немного не в тему: можно ли в эльфе создать (не вручную, а допустим в gcc или еще как нибудь) произвольную секцию? Скажем, .mydata c каким-то размером. В РЕ файле такое просто, а здесь?
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории