This repository has been archived by the owner on Oct 12, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 422
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1052 from redstar/solaris_elf2
Add headers for link time ELF declarations on Solaris.
- Loading branch information
Showing
8 changed files
with
858 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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); | ||
| } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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*); |
Oops, something went wrong.