This is a maintenance fork
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.5 KiB

#ifndef APE_IDATA_H_
#define APE_IDATA_H_
#ifdef __ASSEMBLER__
#include "ape/relocations.h"
/* clang-format off */
/ Links function from external DLL.
/ This embeds a function pointer in the binary. The NT Executive
/ fills its value before control is handed off to the program.
/ @note only ELF toolchains are powerful enough to use this
/ @see libc/nt/
/ @see ape/
/ @see winimp
.macro .imp dll:req fn:req actual:req hint
.dll \dll
.type \fn,@object
\fn: .quad RVA((\dll\().\actual))
.size \fn,.-\fn
.globl \fn
.hidden \fn
.quad RVA((\dll\().\actual))
.type .Lidata.ilt.\dll\().\actual,@object
.size .Lidata.ilt.\dll\().\actual,.-.Lidata.ilt.\dll\().\actual
.ifnb \hint # hint i.e. guess function ordinal
.short \hint
.short 0
.asciz "\actual"
.align 2 # documented requirement
.globl \dll\().\actual
.hidden \dll\().\actual
.type \dll\().\actual,@object
.size \dll\().\actual,.-\dll\().\actual
/ Defines DLL import.
/ @note this is an implementation detail of .imp
.macro .dll name:req
.equ .Lidata.idt.\name,.
.long RVA(idata.ilt.\name) # ImportLookupTable
.long 0 # TimeDateStamp
.long 0 # ForwarderChain
.long RVA(.Lidata.str.\name) # DllNameRva
.long RVA(idata.iat.\name) # ImportAddressTable
.type .Lidata.idt.\name,@object
.size .Lidata.idt.\name,.-.Lidata.idt.\name
.type idata.ilt.\name,@object
decentralized content
.quad 0
.type idata.hnt.\name,@object
.equ idata.hnt.\name,.
.type idata.iat.\name,@object
decentralized content
.quad 0
.pushsection .rodata.str1.1,"aSM",@progbits,1
.asciz "\name\().dll"
/* clang-format on */
#endif /* __ASSEMBLER__ */
#endif /* APE_IDATA_H_ */