diff --git a/libc-test/build.rs b/libc-test/build.rs index 7d3dfb88e1221..33c9dd59cf911 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -3532,6 +3532,13 @@ fn test_linux(target: &str) { }); cfg.skip_type(move |ty| { + // FIXME: very recent additions to musl, not yet released. + if musl && (ty == "Elf32_Relr" || ty == "Elf64_Relr") { + return true; + } + if sparc64 && (ty == "Elf32_Rela" || ty == "Elf64_Rela") { + return true; + } match ty { // FIXME: `sighandler_t` type is incorrect, see: // https://github.com/rust-lang/libc/issues/1359 diff --git a/libc-test/semver/linux.txt b/libc-test/semver/linux.txt index 38db9aaf3ca58..3a090ad9767e9 100644 --- a/libc-test/semver/linux.txt +++ b/libc-test/semver/linux.txt @@ -415,8 +415,14 @@ EKEYREJECTED EKEYREVOKED EL2HLT EL2NSYNC +ELF32_R_SYM +ELF32_R_TYPE +ELF32_R_INFO EL3HLT EL3RST +ELF64_R_SYM +ELF64_R_TYPE +ELF64_R_INFO ELFCLASS32 ELFCLASS64 ELFCLASSNONE @@ -694,17 +700,26 @@ Elf32_Ehdr Elf32_Half Elf32_Off Elf32_Phdr +Elf32_Rel +Elf32_Rela +Elf32_Relr Elf32_Section Elf32_Shdr Elf32_Sym +Elf32_Sword Elf32_Word +Elf32_Xword Elf64_Addr Elf64_Ehdr Elf64_Half Elf64_Off Elf64_Phdr +Elf64_Rel +Elf64_Rela +Elf64_Relr Elf64_Section Elf64_Shdr +Elf64_Sword Elf64_Sxword Elf64_Sym Elf64_Word diff --git a/src/unix/linux_like/linux/mod.rs b/src/unix/linux_like/linux/mod.rs index eea0fed6a08b5..b5c9c758d3bfd 100644 --- a/src/unix/linux_like/linux/mod.rs +++ b/src/unix/linux_like/linux/mod.rs @@ -27,6 +27,8 @@ pub type Elf32_Half = u16; pub type Elf32_Word = u32; pub type Elf32_Off = u32; pub type Elf32_Addr = u32; +pub type Elf32_Xword = u64; +pub type Elf32_Sword = i32; pub type Elf64_Half = u16; pub type Elf64_Word = u32; @@ -34,10 +36,16 @@ pub type Elf64_Off = u64; pub type Elf64_Addr = u64; pub type Elf64_Xword = u64; pub type Elf64_Sxword = i64; +pub type Elf64_Sword = i32; pub type Elf32_Section = u16; pub type Elf64_Section = u16; +pub type Elf32_Relr = Elf32_Word; +pub type Elf64_Relr = Elf32_Xword; +pub type Elf32_Rel = __c_anonymous_elf32_rel; +pub type Elf64_Rel = __c_anonymous_elf64_rel; + // linux/can.h pub type canid_t = u32; @@ -564,6 +572,16 @@ s! { pub sh_entsize: Elf64_Xword, } + pub struct __c_anonymous_elf32_rel { + pub r_offset: Elf32_Addr, + pub r_info: Elf32_Word, + } + + pub struct __c_anonymous_elf64_rel { + pub r_offset: Elf64_Addr, + pub r_info: Elf64_Xword, + } + pub struct ucred { pub pid: ::pid_t, pub uid: ::uid_t, @@ -997,6 +1015,8 @@ s! { cfg_if! { if #[cfg(not(target_arch = "sparc64"))] { + pub type Elf32_Rela = __c_anonymous_elf32_rela; + pub type Elf64_Rela = __c_anonymous_elf64_rela; s!{ pub struct iw_thrspy { pub addr: ::sockaddr, @@ -1014,6 +1034,17 @@ cfg_if! { pub src_addr: ::sockaddr, pub tsc: [__u8; IW_ENCODE_SEQ_MAX_SIZE], } + pub struct __c_anonymous_elf32_rela { + pub r_offset: Elf32_Addr, + pub r_info: Elf32_Word, + pub r_addend: Elf32_Sword, + } + + pub struct __c_anonymous_elf64_rela { + pub r_offset: Elf64_Addr, + pub r_info: Elf64_Xword, + pub r_addend: Elf64_Sxword, + } } } } @@ -5214,6 +5245,30 @@ f! { pub fn BPF_JUMP(code: ::__u16, k: ::__u32, jt: ::__u8, jf: ::__u8) -> sock_filter { sock_filter{code: code, jt: jt, jf: jf, k: k} } + + pub fn ELF32_R_SYM(val: Elf32_Word) -> Elf32_Word { + val >> 8 + } + + pub fn ELF32_R_TYPE(val: Elf32_Word) -> Elf32_Word { + val & 0xff + } + + pub fn ELF32_R_INFO(sym: Elf32_Word, t: Elf32_Word) -> Elf32_Word { + sym << 8 + t & 0xff + } + + pub fn ELF64_R_SYM(val: Elf64_Xword) -> Elf64_Xword { + val >> 32 + } + + pub fn ELF64_R_TYPE(val: Elf64_Xword) -> Elf64_Xword { + val & 0xffffffff + } + + pub fn ELF64_R_INFO(sym: Elf64_Xword, t: Elf64_Xword) -> Elf64_Xword { + sym << 32 + t + } } safe_f! {