diff options
Diffstat (limited to 'ldso/util/ldd.c')
-rw-r--r-- | ldso/util/ldd.c | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/ldso/util/ldd.c b/ldso/util/ldd.c index d4d7fcce9..defc91cfd 100644 --- a/ldso/util/ldd.c +++ b/ldso/util/ldd.c @@ -87,6 +87,7 @@ #if defined(__sh__) #define MATCH_MACHINE(x) (x == EM_SH) +#define ELFCLASSM ELFCLASS32 #endif #if defined (__v850e__) @@ -139,7 +140,7 @@ Elf32_Shdr * elf_find_section_type( int key, Elf32_Ehdr *ehdr) Elf32_Shdr *shdr; shdr = (Elf32_Shdr *)(ehdr->e_shoff + (char *)ehdr); for (j = ehdr->e_shnum; --j>=0; ++shdr) { - if (key==byteswap32_to_host(shdr->sh_type)) { + if (key==(int)byteswap32_to_host(shdr->sh_type)) { return shdr; } } @@ -151,7 +152,7 @@ Elf32_Phdr * elf_find_phdr_type( int type, Elf32_Ehdr *ehdr) int j; Elf32_Phdr *phdr = (Elf32_Phdr *)(ehdr->e_phoff + (char *)ehdr); for (j = ehdr->e_phnum; --j>=0; ++phdr) { - if (type==byteswap32_to_host(phdr->p_type)) { + if (type==(int)byteswap32_to_host(phdr->p_type)) { return phdr; } } @@ -165,7 +166,7 @@ void * elf_find_dynamic(int const key, Elf32_Dyn *dynp, Elf32_Phdr *pt_text = elf_find_phdr_type(PT_LOAD, ehdr); unsigned tx_reloc = byteswap32_to_host(pt_text->p_vaddr) - byteswap32_to_host(pt_text->p_offset); for (; DT_NULL!=byteswap32_to_host(dynp->d_tag); ++dynp) { - if (key == byteswap32_to_host(dynp->d_tag)) { + if (key == (int)byteswap32_to_host(dynp->d_tag)) { if (return_val == 1) return (void *)(intptr_t)byteswap32_to_host(dynp->d_un.d_val); else @@ -255,8 +256,7 @@ static void search_for_named_library(char *name, char *result, const char *path_ *result = '\0'; } -void locate_library_file(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, - int is_suid, struct library *lib) +void locate_library_file(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, int is_suid, struct library *lib) { char *buf; char *path; @@ -336,7 +336,7 @@ void locate_library_file(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, } } -static int add_library(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, int is_setuid, char *s) +static int add_library(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, int is_setuid, char *s) { char *tmp, *tmp1, *tmp2; struct library *cur, *newlib=lib_list; @@ -384,7 +384,7 @@ static int add_library(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, int i newlib->next = NULL; /* Now try and locate where this library might be living... */ - locate_library_file(ehdr, dynamic, strtab, is_setuid, newlib); + locate_library_file(ehdr, dynamic, is_setuid, newlib); //printf("add_library is adding '%s' to '%s'\n", newlib->name, newlib->path); if (!lib_list) { @@ -403,21 +403,20 @@ static void find_needed_libraries(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *st for (dyns=dynamic; byteswap32_to_host(dyns->d_tag)!=DT_NULL; ++dyns) { if (DT_NEEDED == byteswap32_to_host(dyns->d_tag)) { - add_library(ehdr, dynamic, strtab, is_setuid, (char*)strtab + - byteswap32_to_host(dyns->d_un.d_val)); + add_library(ehdr, dynamic, is_setuid, + (char*)strtab + byteswap32_to_host(dyns->d_un.d_val)); } } } -static struct library * -find_elf_interpreter(Elf32_Ehdr* ehdr, Elf32_Dyn* dynamic, char *strtab, int is_setuid) +static int interpreter_already_found=0; +static struct library * find_elf_interpreter(Elf32_Ehdr* ehdr) { - static int been_there_done_that=0; Elf32_Phdr *phdr; - if (been_there_done_that==1) + if (interpreter_already_found==1) return NULL; - been_there_done_that=1; + interpreter_already_found=1; phdr = elf_find_phdr_type(PT_INTERP, ehdr); if (phdr) { struct library *cur, *newlib=NULL; @@ -501,7 +500,7 @@ int find_dependancies(char* filename) return -1; } - if (statbuf.st_size < sizeof(Elf32_Ehdr)) + if ((size_t)statbuf.st_size < sizeof(Elf32_Ehdr)) goto foo; /* mmap the file to make reading stuff from it effortless */ @@ -529,8 +528,8 @@ foo: fprintf(stderr, "%s: is setuid\n", filename); } - dynsec = elf_find_section_type(SHT_DYNAMIC, ehdr); - interp = find_elf_interpreter(ehdr, dynamic, dynstr, is_suid); + interpreter_already_found=0; + interp = find_elf_interpreter(ehdr); #ifdef __LDSO_LDD_SUPPORT if (interp && ehdr->e_ident[EI_CLASS] == ELFCLASSM && ehdr->e_ident[EI_DATA] == ELFDATAM @@ -567,6 +566,7 @@ foo: } #endif + dynsec = elf_find_section_type(SHT_DYNAMIC, ehdr); if (dynsec) { dynamic = (Elf32_Dyn*)(byteswap32_to_host(dynsec->sh_offset) + (intptr_t)ehdr); dynstr = (char *)elf_find_dynamic(DT_STRTAB, dynamic, ehdr, 0); |