1 // Other Unix (e.g. Linux) platforms use ELF as an object file format
2 // and typically implement an API called `dl_iterate_phdr` to load
5 use super::mystd
::borrow
::ToOwned
;
7 use super::mystd
::ffi
::{CStr, OsStr}
;
8 use super::mystd
::os
::unix
::prelude
::*;
9 use super::{Library, LibrarySegment, OsString, Vec}
;
12 pub(super) fn native_libraries() -> Vec
<Library
> {
13 let mut ret
= Vec
::new();
15 libc
::dl_iterate_phdr(Some(callback
), &mut ret
as *mut Vec
<_
> as *mut _
);
20 // `info` should be a valid pointers.
21 // `vec` should be a valid pointer to a `std::Vec`.
22 unsafe extern "C" fn callback(
23 info
: *mut libc
::dl_phdr_info
,
25 vec
: *mut libc
::c_void
,
28 let libs
= &mut *(vec
as *mut Vec
<Library
>);
29 let is_main_prog
= info
.dlpi_name
.is_null() || *info
.dlpi_name
== 0;
30 let name
= if is_main_prog
{
32 env
::current_exe().map(|e
| e
.into()).unwrap_or_default()
37 let bytes
= CStr
::from_ptr(info
.dlpi_name
).to_bytes();
38 OsStr
::from_bytes(bytes
).to_owned()
40 let headers
= slice
::from_raw_parts(info
.dlpi_phdr
, info
.dlpi_phnum
as usize);
45 .map(|header
| LibrarySegment
{
46 len
: (*header
).p_memsz
as usize,
47 stated_virtual_memory_address
: (*header
).p_vaddr
as usize,
50 bias
: info
.dlpi_addr
as usize,