/** * D header file for GNU/Linux * * $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/link.h, glibc elf/link.h) */module core.sys.linux.link; version (linux):extern (C):nothrow: version (ARM) version = ARM_Any;version (AArch64) version = ARM_Any;version (HPPA) version = HPPA_Any;version (MIPS32) version = MIPS_Any;version (MIPS64) version = MIPS_Any;version (PPC) version = PPC_Any;version (PPC64) version = PPC_Any;version (RISCV32) version = RISCV_Any;version (RISCV64) version = RISCV_Any;version (S390) version = IBMZ_Any;version (SPARC) version = SPARC_Any;version (SPARC64) version = SPARC_Any;version (SystemZ) version = IBMZ_Any;version (X86) version = X86_Any;version (X86_64) version = X86_Any; import core.stdc.stdint : uintptr_t, uint32_t, uint64_t;import core.sys.linux.config : __WORDSIZE;import core.sys.linux.dlfcn : Lmid_t;import core.sys.linux.elf; // <bits/elfclass.h>version (Android){ alias __ELF_NATIVE_CLASS = __WORDSIZE; version (D_LP64) alias Elf_Symndx = uint64_t; else alias Elf_Symndx = uint32_t;}else version (X86_Any){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; alias Elf_Symndx = uint32_t;}else version (HPPA_Any){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; alias Elf_Symndx = uint32_t;}else version (MIPS_Any){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; alias Elf_Symndx = uint32_t;}else version (PPC_Any){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; alias Elf_Symndx = uint32_t;}else version (ARM_Any){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; alias Elf_Symndx = uint32_t;}else version (RISCV_Any){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; alias Elf_Symndx = uint32_t;}else version (SPARC_Any){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; alias Elf_Symndx = uint32_t;}else version (IBMZ_Any){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; static if (__WORDSIZE == 64) alias Elf_Symndx = uint64_t; else alias Elf_Symndx = uint32_t;}else version (LoongArch64){ // http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h alias __ELF_NATIVE_CLASS = __WORDSIZE; alias Elf_Symndx = uint32_t;}else static assert(0, "unimplemented");// <bits/elfclass.h> template ElfW(string type){ mixin("alias ElfW = Elf"~__ELF_NATIVE_CLASS.stringof~"_"~type~";");} enum{ RT_CONSISTENT, RT_ADD, RT_DELETE,} struct r_debug{ int r_version; link_map* r_map; ElfW!"Addr" r_brk; typeof(RT_CONSISTENT) r_state; ElfW!"Addr" r_ldbase;} extern r_debug _r_debug;extern ElfW!"Dyn"* _DYNAMIC; struct link_map{ ElfW!"Addr" l_addr; char* l_name; ElfW!"Dyn"* l_ld; link_map* l_next, l_prev;} enum{ LA_ACT_CONSISTENT, LA_ACT_ADD, LA_ACT_DELETE,} enum{ LA_SER_ORIG = 0x01, LA_SER_LIBPATH = 0x02, LA_SER_RUNPATH = 0x04, LA_SER_CONFIG = 0x08, LA_SER_DEFAULT = 0x40, LA_SER_SECURE = 0x80,} enum{ LA_FLG_BINDTO = 0x01, LA_FLG_BINDFROM = 0x02,} enum{ LA_SYMB_NOPLTENTER = 0x01, LA_SYMB_NOPLTEXIT = 0x02, LA_SYMB_STRUCTCALL = 0x04, LA_SYMB_DLSYM = 0x08, LA_SYMB_ALTVALUE = 0x10,} struct dl_phdr_info{ ElfW!"Addr" dlpi_addr; const(char)* dlpi_name; const(ElfW!"Phdr")* dlpi_phdr; ElfW!"Half" dlpi_phnum; // check the SIZE argument of the dl_iterate_phdr callback whether // the following members are available ulong dlpi_adds; ulong dlpi_subs; size_t dlpi_tls_modid; void *dlpi_tls_data;} private alias dl_iterate_phdr_cb = extern(C) int function(dl_phdr_info*, size_t, void *);private alias dl_iterate_phdr_cb_ngc = extern(C) int function(dl_phdr_info*, size_t, void *) @nogc;extern int dl_iterate_phdr(dl_iterate_phdr_cb __callback, void*__data);extern int dl_iterate_phdr(dl_iterate_phdr_cb_ngc __callback, void*__data) @nogc; // ld.so auditing interfaces prototypes have to be defined by the auditing DSO.extern uint la_version(uint __version);extern void la_activity(uintptr_t *__cookie, uint __flag);extern char* la_objsearch(const(char)* __name, uintptr_t* __cookie, uint __flag);extern uint la_objopen(link_map* __map, Lmid_t __lmid, uintptr_t* __cookie);extern void la_preinit(uintptr_t* __cookie);extern uintptr_t la_symbind32(Elf32_Sym* __sym, uint __ndx, uintptr_t* __refcook, uintptr_t* __defcook, uint *__flags, const(char)* __symname);extern uintptr_t la_symbind64(Elf64_Sym* __sym, uint __ndx, uintptr_t* __refcook, uintptr_t* __defcook, uint* __flags, const(char)* __symname);extern uint la_objclose(uintptr_t *__cookie);
/**
* D header file for GNU/Linux
*
* $(LINK2 http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/link.h, glibc elf/link.h)
*/
module core.sys.linux.link;
version (linux):
extern (C):
nothrow:
version (ARM) version = ARM_Any;
version (AArch64) version = ARM_Any;
version (HPPA) version = HPPA_Any;
version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
version (SystemZ) version = IBMZ_Any;
version (X86) version = X86_Any;
version (X86_64) version = X86_Any;
import core.stdc.stdint : uintptr_t, uint32_t, uint64_t;
import core.sys.linux.config : __WORDSIZE;
import core.sys.linux.dlfcn : Lmid_t;
import core.sys.linux.elf;
// <bits/elfclass.h>
version (Android)
{
alias __ELF_NATIVE_CLASS = __WORDSIZE;
version (D_LP64)
alias Elf_Symndx = uint64_t;
else
alias Elf_Symndx = uint32_t;
}
else version (X86_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
alias Elf_Symndx = uint32_t;
}
else version (HPPA_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
alias Elf_Symndx = uint32_t;
}
else version (MIPS_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
alias Elf_Symndx = uint32_t;
}
else version (PPC_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
alias Elf_Symndx = uint32_t;
}
else version (ARM_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
alias Elf_Symndx = uint32_t;
}
else version (RISCV_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
alias Elf_Symndx = uint32_t;
}
else version (SPARC_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
alias Elf_Symndx = uint32_t;
}
else version (IBMZ_Any)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
static if (__WORDSIZE == 64)
alias Elf_Symndx = uint64_t;
else
alias Elf_Symndx = uint32_t;
}
else version (LoongArch64)
{
// http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/elfclass.h
alias __ELF_NATIVE_CLASS = __WORDSIZE;
alias Elf_Symndx = uint32_t;
}
else
static assert(0, "unimplemented");
// <bits/elfclass.h>
template ElfW(string type)
{
mixin("alias ElfW = Elf"~__ELF_NATIVE_CLASS.stringof~"_"~type~";");
}
enum
{
RT_CONSISTENT,
RT_ADD,
RT_DELETE,
}
struct r_debug
{
int r_version;
link_map* r_map;
ElfW!"Addr" r_brk;
typeof(RT_CONSISTENT) r_state;
ElfW!"Addr" r_ldbase;
}
extern r_debug _r_debug;
extern ElfW!"Dyn"* _DYNAMIC;
struct link_map
{
ElfW!"Addr" l_addr;
char* l_name;
ElfW!"Dyn"* l_ld;
link_map* l_next, l_prev;
}
enum
{
LA_ACT_CONSISTENT,
LA_ACT_ADD,
LA_ACT_DELETE,
}
enum
{
LA_SER_ORIG = 0x01,
LA_SER_LIBPATH = 0x02,
LA_SER_RUNPATH = 0x04,
LA_SER_CONFIG = 0x08,
LA_SER_DEFAULT = 0x40,
LA_SER_SECURE = 0x80,
}
enum
{
LA_FLG_BINDTO = 0x01,
LA_FLG_BINDFROM = 0x02,
}
enum
{
LA_SYMB_NOPLTENTER = 0x01,
LA_SYMB_NOPLTEXIT = 0x02,
LA_SYMB_STRUCTCALL = 0x04,
LA_SYMB_DLSYM = 0x08,
LA_SYMB_ALTVALUE = 0x10,
}
struct dl_phdr_info
{
ElfW!"Addr" dlpi_addr;
const(char)* dlpi_name;
const(ElfW!"Phdr")* dlpi_phdr;
ElfW!"Half" dlpi_phnum;
// check the SIZE argument of the dl_iterate_phdr callback whether
// the following members are available
ulong dlpi_adds;
ulong dlpi_subs;
size_t dlpi_tls_modid;
void *dlpi_tls_data;
}
private alias dl_iterate_phdr_cb = extern(C) int function(dl_phdr_info*, size_t, void *);
private alias dl_iterate_phdr_cb_ngc = extern(C) int function(dl_phdr_info*, size_t, void *) @nogc;
extern int dl_iterate_phdr(dl_iterate_phdr_cb __callback, void*__data);
extern int dl_iterate_phdr(dl_iterate_phdr_cb_ngc __callback, void*__data) @nogc;
// ld.so auditing interfaces prototypes have to be defined by the auditing DSO.
extern uint la_version(uint __version);
extern void la_activity(uintptr_t *__cookie, uint __flag);
extern char* la_objsearch(const(char)* __name, uintptr_t* __cookie,
uint __flag);
extern uint la_objopen(link_map* __map, Lmid_t __lmid,
uintptr_t* __cookie);
extern void la_preinit(uintptr_t* __cookie);
extern uintptr_t la_symbind32(Elf32_Sym* __sym, uint __ndx,
uintptr_t* __refcook, uintptr_t* __defcook,
uint *__flags, const(char)* __symname);
extern uintptr_t la_symbind64(Elf64_Sym* __sym, uint __ndx,
uintptr_t* __refcook, uintptr_t* __defcook,
uint* __flags, const(char)* __symname);
extern uint la_objclose(uintptr_t *__cookie);