Fallback to "/usr/lib:/lib" if libraries aren't found in DT_RPATH

This commit is contained in:
Pierre Pronchery 2011-07-10 00:21:36 +00:00
parent 81dfb821b0
commit eb74715b31

View File

@ -43,7 +43,7 @@ static int ELFFUNC(phdr)(char const * filename, FILE * fp, ELFTYPE(Ehdr) * ehdr,
ELFTYPE(Phdr) * phdr); ELFTYPE(Phdr) * phdr);
static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp, static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp,
ELFTYPE(Ehdr) * ehdr, ELFTYPE(Phdr) * phdr, ELFTYPE(Dyn) * dyn); ELFTYPE(Ehdr) * ehdr, ELFTYPE(Phdr) * phdr, ELFTYPE(Dyn) * dyn);
static void ELFFUNC(phdr_dyn_print)(char const * filename, char const * rpath); static int ELFFUNC(phdr_dyn_print)(char const * filename, char const * rpath);
static char * ELFFUNC(string)(char const * filename, FILE * fp, static char * ELFFUNC(string)(char const * filename, FILE * fp,
ELFTYPE(Ehdr) * ehdr, ELFTYPE(Addr) addr, ELFTYPE(Addr) index); ELFTYPE(Ehdr) * ehdr, ELFTYPE(Addr) addr, ELFTYPE(Addr) index);
@ -147,13 +147,16 @@ static int ELFFUNC(phdr_dyn)(char const * filename, FILE * fp,
if((p = ELFFUNC(string)(filename, fp, ehdr, dyn[s].d_un.d_ptr, if((p = ELFFUNC(string)(filename, fp, ehdr, dyn[s].d_un.d_ptr,
dyn[i].d_un.d_val)) == NULL) dyn[i].d_un.d_val)) == NULL)
continue; continue;
ELFFUNC(phdr_dyn_print)(p, rpath); if(ELFFUNC(phdr_dyn_print)(p, rpath) != 0
&& ELFFUNC(phdr_dyn_print)(p,
"/usr/lib:/lib") != 0)
printf("\t%s\n", p);
free(p); free(p);
} }
return 0; return 0;
} }
static void ELFFUNC(phdr_dyn_print)(char const * filename, char const * rpath) static int ELFFUNC(phdr_dyn_print)(char const * filename, char const * rpath)
{ {
size_t len = strlen(filename); size_t len = strlen(filename);
size_t i; size_t i;
@ -175,18 +178,18 @@ static void ELFFUNC(phdr_dyn_print)(char const * filename, char const * rpath)
} }
p = malloc(i + len + 2); p = malloc(i + len + 2);
snprintf(p, i + 1, "%s", rpath); snprintf(p, i + 1, "%s", rpath);
snprintf(&p[i], len, "/%s", filename); snprintf(&p[i], len + 2, "/%s", filename);
if((res = stat(p, &st)) == 0) if((res = stat(p, &st)) == 0)
printf("\t%s => %s\n", filename, p); printf("\t%s => %s\n", filename, p);
free(p); free(p);
if(res == 0) if(res == 0)
return; return 0;
if(rpath[i] == '\0') if(rpath[i] == '\0')
break; break;
rpath += i + 1; rpath += i + 1;
i = 0; i = 0;
} }
printf("\t%s\n", filename); return -1;
} }
static char * ELFFUNC(string)(char const * filename, FILE * fp, static char * ELFFUNC(string)(char const * filename, FILE * fp,