Skip to content
This repository has been archived by the owner on Oct 12, 2022. It is now read-only.

Commit

Permalink
use specialized _rtls_add_phdr on FBSD
Browse files Browse the repository at this point in the history
- also add @nogc overload to dl_iterate_phdr and such
  • Loading branch information
MartinNowak committed Dec 27, 2014
1 parent 658b5a2 commit afb4cc2
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 15 deletions.
10 changes: 6 additions & 4 deletions src/core/sys/freebsd/sys/link_elf.d
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@ struct dl_phdr_info
};


private alias extern(C) int function(dl_phdr_info*, size_t, void*) __dl_iterate_hdr_callback;
extern int dl_iterate_phdr(__dl_iterate_hdr_callback, void*);
extern int _rtld_addr_phdr(const void*, dl_phdr_info*);
extern int _rtld_get_stack_prot();
private alias extern(C) int function(dl_phdr_info*, size_t, void *) dl_iterate_phdr_cb;
private alias extern(C) int function(dl_phdr_info*, size_t, void *) @nogc dl_iterate_phdr_cb_ngc;
extern int dl_iterate_phdr(dl_iterate_phdr_cb __callback, void*__data);
extern int dl_iterate_phdr(dl_iterate_phdr_cb_ngc __callback, void*__data) @nogc;
extern int _rtld_addr_phdr(const void*, dl_phdr_info*) @nogc;
extern int _rtld_get_stack_prot() @nogc;
7 changes: 4 additions & 3 deletions src/core/sys/linux/link.d
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,10 @@ struct dl_phdr_info
void *dlpi_tls_data;
}

private alias extern(C) int function(dl_phdr_info*, size_t, void *) __Callback;
extern int dl_iterate_phdr(__Callback __callback, void*__data);

private alias extern(C) int function(dl_phdr_info*, size_t, void *) dl_iterate_phdr_cb;
private alias extern(C) int function(dl_phdr_info*, size_t, void *) @nogc dl_iterate_phdr_cb_ngc;
extern int dl_iterate_phdr(dl_iterate_phdr_cb __callback, void*__data);
extern int dl_iterate_phdr(dl_iterate_phdr_cb_ngc __callback, void*__data) @nogc;

// ld.so auditing interfaces prototypes have to be defined by the auditing DSO.
extern uint la_version(uint __version);
Expand Down
6 changes: 4 additions & 2 deletions src/core/sys/solaris/link.d
Original file line number Diff line number Diff line change
Expand Up @@ -167,5 +167,7 @@ struct dl_phdr_info {
uint64_t dlpi_subs;
};

private alias extern(C) int function(dl_phdr_info*, size_t, void*) __dl_iterate_hdr_callback;
extern int dl_iterate_phdr(__dl_iterate_hdr_callback, void*);
private alias extern(C) int function(dl_phdr_info*, size_t, void *) dl_iterate_phdr_cb;
private alias extern(C) int function(dl_phdr_info*, size_t, void *) @nogc dl_iterate_phdr_cb_ngc;
extern int dl_iterate_phdr(dl_iterate_phdr_cb __callback, void*__data);
extern int dl_iterate_phdr(dl_iterate_phdr_cb_ngc __callback, void*__data) @nogc;
13 changes: 7 additions & 6 deletions src/rt/sections_elf_shared.d
Original file line number Diff line number Diff line change
Expand Up @@ -708,13 +708,11 @@ void scanSegments(in ref dl_phdr_info info, DSO* pdso)
* References:
* http://linux.die.net/man/3/dl_iterate_phdr
*/
nothrow
bool findDSOInfoForAddr(in void* addr, dl_phdr_info* result=null)
version (linux) bool findDSOInfoForAddr(in void* addr, dl_phdr_info* result=null) nothrow @nogc
{
static struct DG { const(void)* addr; dl_phdr_info* result; }

extern(C) nothrow
int callback(dl_phdr_info* info, size_t sz, void* arg)
extern(C) int callback(dl_phdr_info* info, size_t sz, void* arg) nothrow @nogc
{
auto p = cast(DG*)arg;
if (findSegmentForAddr(*info, p.addr))
Expand All @@ -733,13 +731,16 @@ bool findDSOInfoForAddr(in void* addr, dl_phdr_info* result=null)
*/
return dl_iterate_phdr(&callback, &dg) != 0;
}
else version (FreeBSD) bool findDSOInfoForAddr(in void* addr, dl_phdr_info* result=null) nothrow @nogc
{
return !!_rtld_addr_phdr(addr, result);
}

/*********************************
* Determine if 'addr' lies within shared object 'info'.
* If so, return true and fill in 'result' with the corresponding ELF program header.
*/
nothrow
bool findSegmentForAddr(in ref dl_phdr_info info, in void* addr, ElfW!"Phdr"* result=null)
bool findSegmentForAddr(in ref dl_phdr_info info, in void* addr, ElfW!"Phdr"* result=null) nothrow @nogc
{
if (addr < cast(void*)info.dlpi_addr) // less than base address of object means quick reject
return false;
Expand Down

0 comments on commit afb4cc2

Please sign in to comment.