Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add workaround for musl lack of SONAME support #34

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ authors = ["Mosè Giordano", "Elliot Saba"]
version = "1.3.0"

[deps]
Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
Preferences = "21216c6a-2e73-6563-6e65-726566657250"

[compat]
Expand Down
1 change: 1 addition & 0 deletions src/JLLWrappers.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ end

if VERSION >= v"1.6.0-DEV"
using Preferences
using Base.BinaryPlatforms
end

# We need to glue expressions together a lot
Expand Down
115 changes: 115 additions & 0 deletions src/musl_abi/dso_v1.1.12.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
#=
struct dso {
#if DL_FDPIC
struct fdpic_loadmap *loadmap;
#else
unsigned char *base;
#endif
char *name;
size_t *dynv;
struct dso *next, *prev;

Phdr *phdr;
int phnum;
size_t phentsize;
int refcnt;
Sym *syms;
uint32_t *hashtab;
uint32_t *ghashtab;
int16_t *versym;
char *strings;
unsigned char *map;
size_t map_len;
dev_t dev;
ino_t ino;
signed char global;
char relocated;
char constructed;
char kernel_mapped;
struct dso **deps, *needed_by;
char *rpath_orig, *rpath;
void *tls_image;
size_t tls_len, tls_size, tls_align, tls_id, tls_offset;
size_t relro_start, relro_end;
void **new_dtv;
unsigned char *new_tls;
volatile int new_dtv_idx, new_tls_idx;
struct td_index *td_index;
struct dso *fini_next;
char *shortname;
#if DL_FDPIC
unsigned char *base;
#else
struct fdpic_loadmap *loadmap;
#endif
struct funcdesc {
void *addr;
size_t *got;
} *funcdescs;
size_t *got;
char buf[];
};
=#

struct musl_dso_v1_1_12 <: musl_dso
# Things we find mildly interesting
base::Ptr{Cvoid}
name::Ptr{UInt8}

# The wasteland of things we don't care about
dynv::Ptr{Csize_t}
next::Ptr{musl_dso}
prev::Ptr{musl_dso}

phdr::Ptr{Elf_Phdr}
phnum::Cint
phentsize::Csize_t
refcount::Cint

syms::Ptr{Cvoid}
hashtab::Ptr{Cvoid}
ghashtab::Ptr{Cvoid}
versym::Ptr{Int16}
strings::Ptr{UInt8}
lazy::Ptr{Csize_t}
lazy_cnt::Csize_t

map::Ptr{Cuchar}
map_len::Csize_t

# We assume that dev_t and ino_t are always `uint64_t`, even on 32-bit systems.
dev::UInt64
ino::UInt64
dso_global::Cchar
relocated::Cchar
constructed::Cchar
kernel_mapped::Cchar
# NOTE: struct layout rules should insert 5 bytes of space here
deps::Ptr{Ptr{musl_dso}}
needed_by::Ptr{musl_dso}
rpath_orig::Ptr{UInt8}
rpath::Ptr{UInt8}

tls::Ptr{Cvoid}
tls_len::Csize_t
tls_size::Csize_t
tls_align::Csize_t
tls_id::Csize_t
tls_offset::Csize_t
relro_start::Csize_t
relro_end::Csize_t
new_dtv::Ptr{Ptr{Cuint}}
new_tls::Ptr{UInt8}
new_dtv_idx::Cint
new_tls_idx::Cint
td_index::Ptr{Cvoid}
fini_next::Ptr{musl_dso}

# Finally! The field we're interested in!
shortname::Ptr{UInt8}

# We'll put this stuff at the end because it might be interesting to someone somewhere
loadmap::Ptr{Cvoid}
funcdesc::Ptr{Cvoid}
got::Ptr{Csize_t}
end
111 changes: 111 additions & 0 deletions src/musl_abi/dso_v1.1.13.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#=
struct dso {
#if DL_FDPIC
struct fdpic_loadmap *loadmap;
#else
unsigned char *base;
#endif
char *name;
size_t *dynv;
struct dso *next, *prev;

Phdr *phdr;
int phnum;
size_t phentsize;
int refcnt;
Sym *syms;
Elf_Symndx *hashtab;
uint32_t *ghashtab;
int16_t *versym;
char *strings;
unsigned char *map;
size_t map_len;
dev_t dev;
ino_t ino;
signed char global;
char relocated;
char constructed;
char kernel_mapped;
struct dso **deps, *needed_by;
char *rpath_orig, *rpath;
struct tls_module tls;
size_t tls_id;
size_t relro_start, relro_end;
void **new_dtv;
unsigned char *new_tls;
volatile int new_dtv_idx, new_tls_idx;
struct td_index *td_index;
struct dso *fini_next;
char *shortname;
#if DL_FDPIC
unsigned char *base;
#else
struct fdpic_loadmap *loadmap;
#endif
struct funcdesc {
void *addr;
size_t *got;
} *funcdescs;
size_t *got;
char buf[];
};
=#

struct musl_dso_v1_1_13 <: musl_dso
# Things we find mildly interesting
base::Ptr{Cvoid}
name::Ptr{UInt8}

# The wasteland of things we don't care about
dynv::Ptr{Csize_t}
next::Ptr{musl_dso}
prev::Ptr{musl_dso}

phdr::Ptr{Elf_Phdr}
phnum::Cint
phentsize::Csize_t
refcount::Cint

syms::Ptr{Cvoid}
hashtab::Ptr{Cvoid}
ghashtab::Ptr{Cvoid}
versym::Ptr{Int16}
strings::Ptr{UInt8}
lazy::Ptr{Csize_t}
lazy_cnt::Csize_t

map::Ptr{Cuchar}
map_len::Csize_t

# We assume that dev_t and ino_t are always `uint64_t`, even on 32-bit systems.
dev::UInt64
ino::UInt64
dso_global::Cchar
relocated::Cchar
constructed::Cchar
kernel_mapped::Cchar
# NOTE: struct layout rules should insert 5 bytes of space here
deps::Ptr{Ptr{musl_dso}}
needed_by::Ptr{musl_dso}
rpath_orig::Ptr{UInt8}
rpath::Ptr{UInt8}

tls::musl_tls_module
tls_id::Csize_t
relro_start::Csize_t
relro_end::Csize_t
new_dtv::Ptr{Ptr{Cuint}}
new_tls::Ptr{UInt8}
new_dtv_idx::Cint
new_tls_idx::Cint
td_index::Ptr{Cvoid}
fini_next::Ptr{musl_dso}

# Finally! The field we're interested in!
shortname::Ptr{UInt8}

# We'll put this stuff at the end because it might be interesting to someone somewhere
loadmap::Ptr{Cvoid}
funcdesc::Ptr{Cvoid}
got::Ptr{Csize_t}
end
111 changes: 111 additions & 0 deletions src/musl_abi/dso_v1.1.17.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#=
struct dso {
#if DL_FDPIC
struct fdpic_loadmap *loadmap;
#else
unsigned char *base;
#endif
char *name;
size_t *dynv;
struct dso *next, *prev;

Phdr *phdr;
int phnum;
size_t phentsize;
Sym *syms;
Elf_Symndx *hashtab;
uint32_t *ghashtab;
int16_t *versym;
char *strings;
struct dso *syms_next, *lazy_next;
size_t *lazy, lazy_cnt;
unsigned char *map;
size_t map_len;
dev_t dev;
ino_t ino;
char relocated;
char constructed;
char kernel_mapped;
struct dso **deps, *needed_by;
char *rpath_orig, *rpath;
struct tls_module tls;
size_t tls_id;
size_t relro_start, relro_end;
uintptr_t *new_dtv;
unsigned char *new_tls;
volatile int new_dtv_idx, new_tls_idx;
struct td_index *td_index;
struct dso *fini_next;
char *shortname;
#if DL_FDPIC
unsigned char *base;
#else
struct fdpic_loadmap *loadmap;
#endif
struct funcdesc {
void *addr;
size_t *got;
} *funcdescs;
size_t *got;
char buf[];
};
=#

struct musl_dso_v1_1_17 <: musl_dso
# Things we find mildly interesting
base::Ptr{Cvoid}
name::Ptr{UInt8}

# The wasteland of things we don't care about
dynv::Ptr{Csize_t}
next::Ptr{musl_dso}
prev::Ptr{musl_dso}

phdr::Ptr{Elf_Phdr}
phnum::Cint
phentsize::Csize_t

syms::Ptr{Cvoid}
hashtab::Ptr{Cvoid}
ghashtab::Ptr{Cvoid}
versym::Ptr{Int16}
strings::Ptr{UInt8}
syms_next::Ptr{musl_dso}
lazy_next::Ptr{musl_dso}
lazy::Ptr{Csize_t}
lazy_cnt::Csize_t

map::Ptr{Cuchar}
map_len::Csize_t

# We assume that dev_t and ino_t are always `uint64_t`, even on 32-bit systems.
dev::UInt64
ino::UInt64
relocated::Cchar
constructed::Cchar
kernel_mapped::Cchar
# NOTE: struct layout rules should insert 5 bytes of space here
deps::Ptr{Ptr{musl_dso}}
needed_by::Ptr{musl_dso}
rpath_orig::Ptr{UInt8}
rpath::Ptr{UInt8}

tls::musl_tls_module
tls_id::Csize_t
relro_start::Csize_t
relro_end::Csize_t
new_dtv::Ptr{Ptr{Cuint}}
new_tls::Ptr{UInt8}
new_dtv_idx::Cint
new_tls_idx::Cint
td_index::Ptr{Cvoid}
fini_next::Ptr{musl_dso}

# Finally! The field we're interested in!
shortname::Ptr{UInt8}

# We'll put this stuff at the end because it might be interesting to someone somewhere
loadmap::Ptr{Cvoid}
funcdesc::Ptr{Cvoid}
got::Ptr{Csize_t}
end
Loading