Showing with 858 additions and 2 deletions.
  1. +11 −1 mak/COPY
  2. +12 −1 mak/MANIFEST
  3. +12 −0 src/core/sys/solaris/elf.d
  4. +166 −0 src/core/sys/solaris/libelf.d
  5. +171 −0 src/core/sys/solaris/link.d
  6. +426 −0 src/core/sys/solaris/sys/link.d
  7. +30 −0 win32.mak
  8. +30 −0 win64.mak
12 changes: 11 additions & 1 deletion mak/COPY
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,20 @@ COPY=\
$(IMPDIR)\core\sys\posix\sys\utsname.d \
\
$(IMPDIR)\core\sys\solaris\dlfcn.d \
$(IMPDIR)\core\sys\solaris\elf.d \
$(IMPDIR)\core\sys\solaris\execinfo.d \
$(IMPDIR)\core\sys\solaris\libelf.d \
$(IMPDIR)\core\sys\solaris\link.d \
$(IMPDIR)\core\sys\solaris\sys\elf.d \
$(IMPDIR)\core\sys\solaris\sys\elf_386.d \
$(IMPDIR)\core\sys\solaris\sys\elf_amd64.d \
$(IMPDIR)\core\sys\solaris\sys\elf_notes.d \
$(IMPDIR)\core\sys\solaris\sys\elf_SPARC.d \
$(IMPDIR)\core\sys\solaris\sys\elftypes.d \
$(IMPDIR)\core\sys\solaris\sys\link.d \
$(IMPDIR)\core\sys\solaris\sys\procset.d \
$(IMPDIR)\core\sys\solaris\sys\types.d \
$(IMPDIR)\core\sys\solaris\sys\priocntl.d \
$(IMPDIR)\core\sys\solaris\execinfo.d \
\
$(IMPDIR)\core\sys\windows\com.d \
$(IMPDIR)\core\sys\windows\dbghelp.d \
Expand Down
13 changes: 12 additions & 1 deletion mak/MANIFEST
Original file line number Diff line number Diff line change
Expand Up @@ -153,10 +153,21 @@ MANIFEST=\
src\core\sys\posix\sys\wait.d \
\
src\core\sys\solaris\dlfcn.d \
src\core\sys\solaris\elf.d \
src\core\sys\solaris\execinfo.d \
src\core\sys\solaris\libelf.d \
src\core\sys\solaris\link.d \
\
src\core\sys\solaris\sys\elf.d \
src\core\sys\solaris\sys\elf_386.d \
src\core\sys\solaris\sys\elf_amd64.d \
src\core\sys\solaris\sys\elf_notes.d \
src\core\sys\solaris\sys\elf_SPARC.d \
src\core\sys\solaris\sys\elftypes.d \
src\core\sys\solaris\sys\link.d \
src\core\sys\solaris\sys\priocntl.d \
src\core\sys\solaris\sys\procset.d \
src\core\sys\solaris\sys\types.d \
src\core\sys\solaris\execinfo.d \
\
src\core\sys\windows\com.d \
src\core\sys\windows\dbghelp.d \
Expand Down
12 changes: 12 additions & 0 deletions src/core/sys/solaris/elf.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/**
* D header file for Solaris.
*
* $(LINK2 http://src.illumos.org/source/xref/illumos-gate/usr/src/head/elf.h, illumos elf.h)
*/
module core.sys.solaris.link;

version (Solaris):
extern (C):
nothrow:

public import core.sys.solaris.sys.elf;
166 changes: 166 additions & 0 deletions src/core/sys/solaris/libelf.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
/**
* D header file for Solaris.
*
* $(LINK2 http://src.illumos.org/source/xref/illumos-gate/usr/src/head/libelf.h, illumos libelf.h)
*/
module core.sys.solaris.libelf;

version (Solaris):
extern (C):
nothrow:

import core.stdc.config;
import core.sys.posix.sys.types;
import core.sys.solaris.sys.elf;

enum Elf_Cmd
{
ELF_C_NULL = 0,
ELF_C_READ,
ELF_C_WRITE,
ELF_C_CLR,
ELF_C_SET,
ELF_C_FDDONE,
ELF_C_FDREAD,
ELF_C_RDWR,
ELF_C_WRIMAGE,
ELF_C_IMAGE,
ELF_C_NUM
}

enum ELF_F_DIRTY = 0x1;
enum ELF_F_LAYOUT = 0x4;

enum Elf_Kind
{
ELF_K_NONE = 0,
ELF_K_AR,
ELF_K_COFF,
ELF_K_ELF,
ELF_K_NUM
}

enum Elf_Type
{
ELF_T_BYTE = 0,
ELF_T_ADDR,
ELF_T_DYN,
ELF_T_EHDR,
ELF_T_HALF,
ELF_T_OFF,
ELF_T_PHDR,
ELF_T_RELA,
ELF_T_REL,
ELF_T_SHDR,
ELF_T_SWORD,
ELF_T_SYM,
ELF_T_WORD,
ELF_T_VDEF,
ELF_T_VNEED,
ELF_T_SXWORD,
ELF_T_XWORD,
ELF_T_SYMINFO,
ELF_T_NOTE,
ELF_T_MOVE,
ELF_T_MOVEP,
ELF_T_CAP,
ELF_T_NUM
}

struct Elf
{
}

struct Elf_Scn
{
}

struct Elf_Arhdr
{
char* ar_name;
time_t ar_date;
uid_t ar_uid;
gid_t ar_gid;
mode_t ar_mode;
off_t ar_size;
char* ar_rawname;
}

struct Elf_Arsym
{
char* as_name;
size_t as_off;
c_ulong as_hash;
}

struct Elf_Data
{
void* d_buf;
Elf_Type d_type;
size_t d_size;
off_t d_off;
size_t d_align;
uint d_version;
}

Elf* elf_begin(int, Elf_Cmd, Elf*);
int elf_cntl(Elf*, Elf_Cmd);
int elf_end(Elf*);
const(char)* elf_errmsg(int);
int elf_errno();
void elf_fill(int);
uint elf_flagdata(Elf_Data*, Elf_Cmd, uint);
uint elf_flagehdr(Elf*, Elf_Cmd, uint);
uint elf_flagelf(Elf*, Elf_Cmd, uint);
uint elf_flagphdr(Elf*, Elf_Cmd, uint);
uint elf_flagscn(Elf_Scn*, Elf_Cmd, uint);
uint elf_flagshdr(Elf_Scn*, Elf_Cmd, uint);
size_t elf32_fsize(Elf_Type, size_t, uint);
Elf_Arhdr* elf_getarhdr(Elf*);
Elf_Arsym* elf_getarsym(Elf*, size_t*);
off_t elf_getbase(Elf*);
Elf_Data* elf_getdata(Elf_Scn*, Elf_Data*);
Elf32_Ehdr* elf32_getehdr(Elf*);
char* elf_getident(Elf*, size_t*);
Elf32_Phdr* elf32_getphdr(Elf*);
Elf_Scn* elf_getscn(Elf*, size_t);
Elf32_Shdr* elf32_getshdr(Elf_Scn*);
int elf_getphnum(Elf*, size_t*);
int elf_getphdrnum(Elf*, size_t*);
int elf_getshnum(Elf*, size_t*);
int elf_getshdrnum(Elf*, size_t*);
int elf_getshstrndx(Elf*, size_t*);
int elf_getshdrstrndx(Elf*, size_t*);
c_ulong elf_hash(in char*);
uint elf_sys_encoding();
long elf32_checksum(Elf*);
Elf_Kind elf_kind(Elf*);
Elf* elf_memory(char*, size_t);
size_t elf_ndxscn(Elf_Scn*);
Elf_Data* elf_newdata(Elf_Scn*);
Elf32_Ehdr* elf32_newehdr(Elf*);
Elf32_Phdr* elf32_newphdr(Elf*, size_t);
Elf_Scn* elf_newscn(Elf*);
Elf_Scn* elf_nextscn(Elf*, Elf_Scn*);
Elf_Cmd elf_next(Elf*);
size_t elf_rand(Elf*, size_t);
Elf_Data* elf_rawdata(Elf_Scn*, Elf_Data*);
char* elf_rawfile(Elf*, size_t*);
char* elf_strptr(Elf*, size_t, size_t);
off_t elf_update(Elf*, Elf_Cmd);
uint elf_version(uint);
Elf_Data* elf32_xlatetof(Elf_Data*, in Elf_Data*, uint);
Elf_Data* elf32_xlatetom(Elf_Data*, in Elf_Data*, uint);

version(D_LP64)
{
size_t elf64_fsize(Elf_Type, size_t, uint);
Elf64_Ehdr* elf64_getehdr(Elf*);
Elf64_Phdr* elf64_getphdr(Elf*);
Elf64_Shdr* elf64_getshdr(Elf_Scn*);
long elf64_checksum(Elf*);
Elf64_Ehdr* elf64_newehdr(Elf*);
Elf64_Phdr* elf64_newphdr(Elf*, size_t);
Elf_Data* elf64_xlatetof(Elf_Data*, in Elf_Data*, uint);
Elf_Data* elf64_xlatetom(Elf_Data*, in Elf_Data*, uint);
}
171 changes: 171 additions & 0 deletions src/core/sys/solaris/link.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
/**
* D header file for Solaris.
*
* $(LINK2 http://src.illumos.org/source/xref/illumos-gate/usr/src/head/link.h, illumos link.h)
*/
module core.sys.solaris.link;

version (Solaris):
extern (C):
nothrow:

import core.stdc.stdint;
import core.sys.solaris.dlfcn;
import core.sys.solaris.libelf;
import core.sys.solaris.sys.elf;
import core.sys.solaris.sys.link;

uint ld_version(uint);
void ld_input_done(uint*);

void ld_start(in char*, in Elf32_Half, in char*);
void ld_atexit(int);
void ld_open(in char**, in char**, int*, int, Elf**, Elf*, size_t, in Elf_Kind);
void ld_file(in char*, in Elf_Kind, int, Elf*);
void ld_input_section(in char*, Elf32_Shdr**, Elf32_Word, Elf_Data*, Elf*, uint*);
void ld_section(in char*, Elf32_Shdr*, Elf32_Word, Elf_Data*, Elf*);

version(D_LP64)
{
void ld_start64(inchar*, in Elf64_Half, in char*);
void ld_atexit64(int);
void ld_open64(in char**, in char**, int*, int, Elf**, Elf*, size_t, in Elf_Kind);
void ld_file64(in char*, in Elf_Kind, int, Elf*);
void ld_input_section64(in char*, Elf64_Shdr**, Elf64_Word, Elf_Data*, Elf*, uint*);
void ld_section64(in char*, Elf64_Shdr*, Elf64_Word, Elf_Data*, Elf*);
}

enum LD_SUP_VNONE = 0;
enum LD_SUP_VERSION1 = 1;
enum LD_SUP_VERSION2 = 2;
enum LD_SUP_VERSION3 = 3;
enum LD_SUP_VCURRENT = LD_SUP_VERSION3;

enum LD_SUP_DERIVED = 0x1;
enum LD_SUP_INHERITED = 0x2;
enum LD_SUP_EXTRACTED = 0x4;

enum LM_ID_BASE = 0x00;
enum LM_ID_LDSO = 0x01;
enum LM_ID_NUM = 2;

enum LM_ID_BRAND = 0xfd;
enum LM_ID_NONE = 0xfe;
enum LM_ID_NEWLM = 0xff;

enum LAV_NONE = 0;
enum LAV_VERSION1 = 1;
enum LAV_VERSION2 = 2;
enum LAV_VERSION3 = 3;
enum LAV_VERSION4 = 4;
enum LAV_VERSION5 = 5;
enum LAV_CURRENT = LAV_VERSION5;
enum LAV_NUM = 6;

enum LA_FLG_BINDTO = 0x0001;
enum LA_FLG_BINDFROM = 0x0002;

enum LA_SYMB_NOPLTENTER = 0x0001;
enum LA_SYMB_NOPLTEXIT = 0x0002;
enum LA_SYMB_STRUCTCALL = 0x0004;
enum LA_SYMB_DLSYM = 0x0008;
enum LA_SYMB_ALTVALUE = 0x0010;

enum LA_SER_ORIG = 0x001;
enum LA_SER_LIBPATH = 0x002;
enum LA_SER_RUNPATH = 0x004;
enum LA_SER_CONFIG = 0x008;
enum LA_SER_DEFAULT = 0x040;
enum LA_SER_SECURE = 0x080;

enum LA_SER_MASK = 0xfff;

enum LA_ACT_CONSISTENT = 0x00;
enum LA_ACT_ADD = 0x01;
enum LA_ACT_DELETE = 0x02;
enum LA_ACT_MAX = 3;

version(D_LP64)
alias long lagreg_t;
else
alias int lagreg_t;

struct _la_sparc_regs
{
lagreg_t lr_rego0;
lagreg_t lr_rego1;
lagreg_t lr_rego2;
lagreg_t lr_rego3;
lagreg_t lr_rego4;
lagreg_t lr_rego5;
lagreg_t lr_rego6;
lagreg_t lr_rego7;
}

version(D_LP64)
{
alias _la_sparc_regs La_sparcv9_regs;
struct La_amd64_regs
{
lagreg_t lr_rsp;
lagreg_t lr_rbp;
lagreg_t lr_rdi;
lagreg_t lr_rsi;
lagreg_t lr_rdx;
lagreg_t lr_rcx;
lagreg_t lr_r8;
lagreg_t lr_r9;
}
}
else
{
alias _la_sparc_regs La_sparcv8_regs;
typedef struct La_i86_regs
{
lagreg_t lr_esp;
lagreg_t lr_ebp;
}
}

uint la_version(uint);
void la_activity(uintptr_t*, uint);
void la_preinit(uintptr_t*);
char* la_objsearch(in char*, uintptr_t*, uint);
uint la_objopen(Link_map*, Lmid_t, uintptr_t*);
uint la_objclose(uintptr_t*);
int la_objfilter(uintptr_t*, in char*, uintptr_t*, uint);

version(D_LP64)
{
uintptr_t la_amd64_pltenter(Elf64_Sym*, uint, uintptr_t*, uintptr_t*, La_amd64_regs*, uint*, in char*);
uintptr_t la_symbind64(Elf64_Sym*, uint, uintptr_t*, uintptr_t*, uint*, in char*);
uintptr_t la_sparcv9_pltenter(Elf64_Sym*, uint, uintptr_t*, uintptr_t*, La_sparcv9_regs*, uint*, in char*);
uintptr_t la_pltexit64(Elf64_Sym*, uint, uintptr_t*, uintptr_t*, uintptr_t, in char*);
}
else
{
uintptr_t la_symbind32(Elf32_Sym*, uint, uintptr_t*, uintptr_t*, uint*);
uintptr_t la_sparcv8_pltenter(Elf32_Sym*, uint, uintptr_t*, uintptr_t*, La_sparcv8_regs*, uint*);
uintptr_t la_i86_pltenter(Elf32_Sym*, uint, uintptr_t*, uintptr_t*, La_i86_regs*, uint*);
uintptr_t la_pltexit(Elf32_Sym*, uint, uintptr_t*, uintptr_t*, uintptr_t);
}

template ElfW(string type)
{
version (D_LP64)
mixin("alias Elf64_"~type~" ElfW;");
else
mixin("alias Elf32_"~type~" ElfW;");
}

struct dl_phdr_info {
ElfW!"Addr" dlpi_addr;
char* dlpi_name;
ElfW!"Phdr"* dlpi_phdr;
ElfW!"Half" dlpi_phnum;
uint64_t dlpi_adds;
uint64_t dlpi_subs;
};

private alias extern(C) int function(dl_phdr_info*, size_t, void*) __dl_iterate_hdr_callback;
extern int dl_iterate_phdr(__dl_iterate_hdr_callback, void*);
Loading