From: Alex Caudill <alex.caudill@gmail.com>
To: musl@lists.openwall.com
Subject: Re: PATCH: dl_iterate_phdr()
Date: Wed, 31 Oct 2012 13:35:08 -0500 [thread overview]
Message-ID: <CAFXnQt7sBr+Ws5ZP9NmSe63kk46Ep01V=dDkHG_tm02Mu9LcYg@mail.gmail.com> (raw)
In-Reply-To: <20121018204559.GH254@brightrain.aerifal.cx>
[-- Attachment #1: Type: text/plain, Size: 918 bytes --]
Sorry for the delay; I *think* this might do it ;)
On 10/18/12, Rich Felker <dalias@aerifal.cx> wrote:
> On Sun, Oct 14, 2012 at 11:47:38PM -0500, Alex Caudill wrote:
>> No kidding: I ragequit the entire internet for a solid 48 hours due to
>> this thread. Turned off my phone, dropped off the grid. I had to step
>> away and reconsider my entire approach to software and really figure
>> out if I should even be spending my time on this. It's so humbling
>> when you think you're beginning to grasp something and then realize
>> that you know NOTHING.
>>
>> Anyway, please let me finish this :)
>
> Hope you're not getting discouraged. :)
> I'd like to get both this and whatever other changed you need
> (sigreturn?) in for the next release. Let me know if you're running
> into any more problems or if you just need some time. It's not a hurry
> since I'm waiting on some testing for microblaze anyway.
>
> Rich
>
[-- Attachment #2: dynlink.patch --]
[-- Type: application/octet-stream, Size: 4132 bytes --]
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index c3cb611..2802c21 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -13,6 +13,7 @@
#include <errno.h>
#include <limits.h>
#include <elf.h>
+#include <link.h>
#include <setjmp.h>
#include <pthread.h>
#include <ctype.h>
@@ -30,12 +31,14 @@ static char errbuf[128];
typedef Elf32_Ehdr Ehdr;
typedef Elf32_Phdr Phdr;
typedef Elf32_Sym Sym;
+typedef Elf32_Addr Addr;
#define R_TYPE(x) ((x)&255)
#define R_SYM(x) ((x)>>8)
#else
typedef Elf64_Ehdr Ehdr;
typedef Elf64_Phdr Phdr;
typedef Elf64_Sym Sym;
+typedef Elf64_Addr Addr;
#define R_TYPE(x) ((x)&0xffffffff)
#define R_SYM(x) ((x)>>32)
#endif
@@ -57,6 +60,8 @@ struct dso {
size_t *dynv;
struct dso *next, *prev;
+ Phdr *phdr;
+ int phnum;
int refcnt;
Sym *syms;
uint32_t *hashtab;
@@ -92,6 +97,7 @@ void *__install_initial_tls(void *);
static struct dso *head, *tail, *libc, *fini_head;
static char *env_path, *sys_path, *r_path;
+static unsigned long long gencnt = 0;
static int ssp_used;
static int runtime;
static int ldd_mode;
@@ -324,6 +330,8 @@ static void *map_library(int fd, struct dso *dso)
eh->e_phoff = sizeof *eh;
}
ph = (void *)((char *)buf + eh->e_phoff);
+ dso->phdr = ph;
+ dso->phnum = eh->e_phnum;
for (i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) {
if (ph->p_type == PT_DYNAMIC)
dyn = ph->p_vaddr;
@@ -815,18 +823,19 @@ void *__dynlink(int argc, char **argv)
lib->name = lib->shortname = "libc.so";
lib->global = 1;
ehdr = (void *)lib->base;
- find_map_range((void *)(aux[AT_BASE]+ehdr->e_phoff),
- ehdr->e_phnum, ehdr->e_phentsize, lib);
- lib->dynv = (void *)(lib->base + find_dyn(
- (void *)(aux[AT_BASE]+ehdr->e_phoff),
- ehdr->e_phnum, ehdr->e_phentsize));
+ lib->phnum = ehdr->e_phnum;
+ lib->phdr = (void *)(aux[AT_BASE]+ehdr->e_phoff);
+ find_map_range(lib->phdr, ehdr->e_phnum, ehdr->e_phentsize, lib);
+ lib->dynv = (void *)(lib->base + find_dyn(lib->phdr,
+ ehdr->e_phnum, ehdr->e_phentsize));
decode_dyn(lib);
if (aux[AT_PHDR]) {
size_t interp_off = 0;
size_t tls_image = 0;
/* Find load address of the main program, via AT_PHDR vs PT_PHDR. */
- phdr = (void *)aux[AT_PHDR];
+ app->phdr = phdr = (void *)aux[AT_PHDR];
+ app->phnum = aux[AT_PHNUM];
for (i=aux[AT_PHNUM]; i; i--, phdr=(void *)((char *)phdr + aux[AT_PHENT])) {
if (phdr->p_type == PT_PHDR)
app->base = (void *)(aux[AT_PHDR] - phdr->p_vaddr);
@@ -890,7 +899,8 @@ void *__dynlink(int argc, char **argv)
/* Attach to vdso, if provided by the kernel */
if (search_vec(auxv, &vdso_base, AT_SYSINFO_EHDR)) {
ehdr = (void *)vdso_base;
- phdr = (void *)(vdso_base + ehdr->e_phoff);
+ vdso->phdr = phdr = (void *)(vdso_base + ehdr->e_phoff);
+ vdso->phnum = ehdr->e_phnum;
for (i=ehdr->e_phnum; i; i--, phdr=(void *)((char *)phdr + ehdr->e_phentsize)) {
if (phdr->p_type == PT_DYNAMIC)
vdso->dynv = (void *)(vdso_base + phdr->p_offset);
@@ -1051,6 +1061,7 @@ void *dlopen(const char *file, int mode)
orig_tail = tail;
end:
__release_ptc();
+ if (p) gencnt++;
pthread_rwlock_unlock(&lock);
if (p) do_init_fini(orig_tail);
pthread_setcancelstate(cs, 0);
@@ -1166,6 +1177,33 @@ void *__dlsym(void *restrict p, const char *restrict s, void *restrict ra)
pthread_rwlock_unlock(&lock);
return res;
}
+
+int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void *data), void *data)
+{
+ struct dso *current;
+ struct dl_phdr_info info;
+ int ret = 0;
+ for(current = head; current;) {
+ info.dlpi_addr = (Addr)current->base;
+ info.dlpi_name = current->name;
+ info.dlpi_phdr = current->phdr;
+ info.dlpi_phnum = current->phnum;
+ info.dlpi_adds = gencnt;
+ info.dlpi_subs = 0;
+ info.dlpi_tls_modid = current->tls_id;
+ info.dlpi_tls_data = current->tls_image;
+
+ ret = (callback)(&info, sizeof (info), data);
+
+ if (ret != 0) break;
+
+ pthread_rwlock_rdlock(&lock);
+ current = current->next;
+ pthread_rwlock_unlock(&lock);
+ }
+ return ret;
+}
#else
void *dlopen(const char *file, int mode)
{
next prev parent reply other threads:[~2012-10-31 18:35 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-11 14:29 Alex Caudill
2012-10-11 23:42 ` Rich Felker
2012-10-12 0:00 ` Rich Felker
2012-10-12 13:28 ` Alex Caudill
2012-10-12 15:43 ` Rich Felker
2012-10-13 1:04 ` Alex Caudill
2012-10-13 1:24 ` Alex Caudill
2012-10-13 1:31 ` Rich Felker
2012-10-15 3:30 ` Rich Felker
2012-10-15 4:47 ` Alex Caudill
2012-10-15 12:41 ` Rich Felker
2012-10-18 20:45 ` Rich Felker
2012-10-31 18:35 ` Alex Caudill [this message]
2012-11-01 1:33 ` Rich Felker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAFXnQt7sBr+Ws5ZP9NmSe63kk46Ep01V=dDkHG_tm02Mu9LcYg@mail.gmail.com' \
--to=alex.caudill@gmail.com \
--cc=musl@lists.openwall.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/musl/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).