summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-02-14 23:50:42 +0000
committerbors <bors@rust-lang.org>2022-02-14 23:50:42 +0000
commitea701b26b2eab1189739b19efeb32f5117f9d9a5 (patch)
treef3f3cbb1f4a0ca71a4759b7f8f11007729287487
parent31657a524190e91d3cf726e089bfc3e015d54ac1 (diff)
parent848a12cb9cf3bea74183ef835b9d0a5314237fec (diff)
downloadrust-libc-ea701b26b2eab1189739b19efeb32f5117f9d9a5.tar.gz
Auto merge of #2665 - devnexen:solarish_dl_phdr_api2, r=Amanieu
solarish systems dl_iterate_phdr support
-rw-r--r--libc-test/build.rs1
-rw-r--r--src/unix/solarish/mod.rs15
-rw-r--r--src/unix/solarish/x86.rs29
-rw-r--r--src/unix/solarish/x86_64.rs30
4 files changed, 75 insertions, 0 deletions
diff --git a/libc-test/build.rs b/libc-test/build.rs
index b80e7315b6..c08cad10d9 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -747,6 +747,7 @@ fn test_solarish(target: &str) {
"ifaddrs.h",
"langinfo.h",
"limits.h",
+ "link.h",
"locale.h",
"mqueue.h",
"net/if.h",
diff --git a/src/unix/solarish/mod.rs b/src/unix/solarish/mod.rs
index 3412f897e9..ec9da2b611 100644
--- a/src/unix/solarish/mod.rs
+++ b/src/unix/solarish/mod.rs
@@ -2954,6 +2954,18 @@ extern "C" {
sfvcnt: ::c_int,
xferred: *mut ::size_t,
) -> ::ssize_t;
+ // #include <link.h>
+ #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+ pub fn dl_iterate_phdr(
+ callback: ::Option<
+ unsafe extern "C" fn(
+ info: *mut dl_phdr_info,
+ size: usize,
+ data: *mut ::c_void,
+ ) -> ::c_int,
+ >,
+ data: *mut ::c_void,
+ ) -> ::c_int;
pub fn getpagesize() -> ::c_int;
pub fn getpagesizes(pagesize: *mut ::size_t, nelem: ::c_int) -> ::c_int;
pub fn mmapobj(
@@ -3033,5 +3045,8 @@ cfg_if! {
if #[cfg(target_arch = "x86_64")] {
mod x86_64;
pub use self::x86_64::*;
+ } else if #[cfg(target_arch = "x86")] {
+ mod x86;
+ pub use self::x86::*;
}
}
diff --git a/src/unix/solarish/x86.rs b/src/unix/solarish/x86.rs
new file mode 100644
index 0000000000..23f52ad3c8
--- /dev/null
+++ b/src/unix/solarish/x86.rs
@@ -0,0 +1,29 @@
+pub type Elf32_Addr = ::c_ulong;
+pub type Elf32_Half = ::c_ushort;
+pub type Elf32_Off = ::c_ulong;
+pub type Elf32_Sword = ::c_long;
+pub type Elf32_Word = ::c_ulong;
+pub type Elf32_Lword = ::c_ulonglong;
+pub type Elf32_Phdr = __c_anonymous_Elf32_Phdr;
+
+s! {
+ pub struct __c_anonymous_Elf32_Phdr {
+ pub p_type: ::Elf32_Word,
+ pub p_offset: ::Elf32_Off,
+ pub p_vaddr: ::Elf32_Addr,
+ pub p_paddr: ::Elf32_Addr,
+ pub p_filesz: ::Elf32_Word,
+ pub p_memsz: ::Elf32_Word,
+ pub p_flags: ::Elf32_Word,
+ pub p_align: ::Elf32_Word,
+ }
+
+ pub struct dl_phdr_info {
+ pub dlpi_addr: ::Elf32_Addr,
+ pub dlpi_name: *const ::c_char,
+ pub dlpi_phdr: *const ::Elf32_Phdr,
+ pub dlpi_phnum: ::Elf32_Half,
+ pub dlpi_adds: ::c_ulonglong,
+ pub dlpi_subs: ::c_ulonglong,
+ }
+}
diff --git a/src/unix/solarish/x86_64.rs b/src/unix/solarish/x86_64.rs
index 7eef2db121..5f75bdb796 100644
--- a/src/unix/solarish/x86_64.rs
+++ b/src/unix/solarish/x86_64.rs
@@ -1,5 +1,15 @@
pub type greg_t = ::c_long;
+pub type Elf64_Addr = ::c_ulong;
+pub type Elf64_Half = ::c_ushort;
+pub type Elf64_Off = ::c_ulong;
+pub type Elf64_Sword = ::c_int;
+pub type Elf64_Sxword = ::c_long;
+pub type Elf64_Word = ::c_uint;
+pub type Elf64_Xword = ::c_ulong;
+pub type Elf64_Lword = ::c_ulong;
+pub type Elf64_Phdr = __c_anonymous_Elf64_Phdr;
+
s! {
pub struct __c_anonymous_fpchip_state {
pub cw: u16,
@@ -17,6 +27,26 @@ s! {
pub status: u32,
pub xstatus: u32,
}
+
+ pub struct __c_anonymous_Elf64_Phdr {
+ pub p_type: ::Elf64_Word,
+ pub p_flags: ::Elf64_Word,
+ pub p_offset: ::Elf64_Off,
+ pub p_vaddr: ::Elf64_Addr,
+ pub p_paddr: ::Elf64_Addr,
+ pub p_filesz: ::Elf64_Xword,
+ pub p_memsz: ::Elf64_Xword,
+ pub p_align: ::Elf64_Xword,
+ }
+
+ pub struct dl_phdr_info {
+ pub dlpi_addr: ::Elf64_Addr,
+ pub dlpi_name: *const ::c_char,
+ pub dlpi_phdr: *const ::Elf64_Phdr,
+ pub dlpi_phnum: ::Elf64_Half,
+ pub dlpi_adds: ::c_ulonglong,
+ pub dlpi_subs: ::c_ulonglong,
+ }
}
s_no_extra_traits! {