From 848a12cb9cf3bea74183ef835b9d0a5314237fec Mon Sep 17 00:00:00 2001 From: David Carlier Date: Tue, 1 Feb 2022 16:14:53 +0000 Subject: [PATCH] solarish systems dl_iterate_phdr support --- libc-test/build.rs | 1 + src/unix/solarish/mod.rs | 15 +++++++++++++++ src/unix/solarish/x86.rs | 29 +++++++++++++++++++++++++++++ src/unix/solarish/x86_64.rs | 30 ++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 src/unix/solarish/x86.rs diff --git a/libc-test/build.rs b/libc-test/build.rs index b80e7315b64b0..c08cad10d935c 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 3412f897e9db8..ec9da2b611fbb 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 + #[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 0000000000000..23f52ad3c894f --- /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 7eef2db121c64..5f75bdb79624a 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! {