Skip to content

Commit 89c90cd

Browse files
committed
Add dl_iterate_phdr for freebsd
1 parent ba4dfc2 commit 89c90cd

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

src/unix/bsd/freebsdlike/freebsd/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,7 @@ extern "C" {
15021502
pub fn nmount(
15031503
iov: *mut ::iovec,
15041504
niov: ::c_uint,
1505-
flags: ::c_int
1505+
flags: ::c_int,
15061506
) -> ::c_int;
15071507
}
15081508

src/unix/bsd/freebsdlike/mod.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,38 @@ pub type nl_item = ::c_int;
1414
pub type id_t = i64;
1515
pub type vm_size_t = ::uintptr_t;
1616

17+
// elf.h
18+
19+
pub type Elf32_Addr = u32;
20+
pub type Elf32_Half = u16;
21+
pub type Elf32_Lword = u64;
22+
pub type Elf32_Off = u32;
23+
pub type Elf32_Sword = i32;
24+
pub type Elf32_Word = u32;
25+
26+
pub type Elf64_Addr = u64;
27+
pub type Elf64_Half = u16;
28+
pub type Elf64_Lword = u64;
29+
pub type Elf64_Off = u64;
30+
pub type Elf64_Sword = i32;
31+
pub type Elf64_Sxword = i64;
32+
pub type Elf64_Word = u32;
33+
pub type Elf64_Xword = u64;
34+
35+
cfg_if! {
36+
if #[cfg(target_pointer_width = "64")] {
37+
type Elf_Addr = Elf64_Addr;
38+
type Elf_Half = Elf64_Half;
39+
type Elf_Phdr = Elf64_Phdr;
40+
} else if #[cfg(target_pointer_width = "32")] {
41+
type Elf_Addr = Elf32_Addr;
42+
type Elf_Half = Elf32_Half;
43+
type Elf_Phdr = Elf32_Phdr;
44+
}
45+
}
46+
47+
// link.h
48+
1749
#[cfg_attr(feature = "extra_traits", derive(Debug))]
1850
pub enum timezone {}
1951
impl ::Copy for timezone {}
@@ -233,6 +265,43 @@ s! {
233265
pub piod_addr: *mut ::c_void,
234266
pub piod_len: ::size_t,
235267
}
268+
269+
// elf.h
270+
271+
pub struct Elf32_Phdr {
272+
pub p_type: Elf32_Word,
273+
pub p_offset: Elf32_Off,
274+
pub p_vaddr: Elf32_Addr,
275+
pub p_paddr: Elf32_Addr,
276+
pub p_filesz: Elf32_Word,
277+
pub p_memsz: Elf32_Word,
278+
pub p_flags: Elf32_Word,
279+
pub p_align: Elf32_Word,
280+
}
281+
282+
pub struct Elf64_Phdr {
283+
pub p_type: Elf64_Word,
284+
pub p_flags: Elf64_Word,
285+
pub p_offset: Elf64_Off,
286+
pub p_vaddr: Elf64_Addr,
287+
pub p_paddr: Elf64_Addr,
288+
pub p_filesz: Elf64_Xword,
289+
pub p_memsz: Elf64_Xword,
290+
pub p_align: Elf64_Xword,
291+
}
292+
293+
// link.h
294+
295+
pub struct dl_phdr_info {
296+
pub dlpi_addr: Elf_Addr,
297+
pub dlpi_name: *const ::c_char,
298+
pub dlpi_phdr: *const Elf_Phdr,
299+
pub dlpi_phnum: Elf_Half,
300+
pub dlpi_adds: ::c_ulonglong,
301+
pub dlpi_subs: ::c_ulonglong,
302+
pub dlpi_tls_modid: usize,
303+
pub dlpi_tls_data: *mut ::c_void,
304+
}
236305
}
237306

238307
s_no_extra_traits! {
@@ -1514,6 +1583,18 @@ extern "C" {
15141583

15151584
pub fn ntp_adjtime(buf: *mut timex) -> ::c_int;
15161585
pub fn ntp_gettime(buf: *mut ntptimeval) -> ::c_int;
1586+
1587+
// #include <link.h>
1588+
pub fn dl_iterate_phdr(
1589+
callback: ::Option<
1590+
unsafe extern "C" fn(
1591+
info: *mut dl_phdr_info,
1592+
size: usize,
1593+
data: *mut ::c_void,
1594+
) -> ::c_int,
1595+
>,
1596+
data: *mut ::c_void,
1597+
) -> ::c_int;
15171598
}
15181599

15191600
#[link(name = "rt")]

0 commit comments

Comments
 (0)