aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/generic/readelflib.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-08-29 10:42:30 +0000
committerUlrich Drepper <drepper@redhat.com>2002-08-29 10:42:30 +0000
commitc98d82db4c7fa8d94bcf8759f8f9ed622cc9b77f (patch)
tree7613124ead9a2e20487390fa7b421d4421355fe2 /sysdeps/generic/readelflib.c
parent69f8b5e8238659abddb2a7777eb33cbe6c5545d5 (diff)
downloadglibc-c98d82db4c7fa8d94bcf8759f8f9ed622cc9b77f.tar
glibc-c98d82db4c7fa8d94bcf8759f8f9ed622cc9b77f.tar.gz
glibc-c98d82db4c7fa8d94bcf8759f8f9ed622cc9b77f.tar.bz2
glibc-c98d82db4c7fa8d94bcf8759f8f9ed622cc9b77f.zip
Update.
2002-08-29 Jakub Jelinek <jakub@redhat.com> * stdio-common/vfprintf.c (vfprintf): Add builtin_expect for string_malloced, it is unlikely to be set. Only call free with non-NULL workspace. * sysdeps/sparc/sparc32/sparcv9/Makefile (sysdep-CFLAGS): Use -mcpu=ultrasparc, not only tune for it. (ASFLAGS*): Set unconditionally. 2002-08-29 Jakub Jelinek <jakub@redhat.com> * sysdeps/generic/readelflib.c (process_elf_file): Make loadaddr ElfW(Addr). Don't mask upper 32-bits and lower 12 bits off from p_vaddr/p_offset when computing loadaddr.
Diffstat (limited to 'sysdeps/generic/readelflib.c')
-rw-r--r--sysdeps/generic/readelflib.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/sysdeps/generic/readelflib.c b/sysdeps/generic/readelflib.c
index c8e439e4d6..27502a994a 100644
--- a/sysdeps/generic/readelflib.c
+++ b/sysdeps/generic/readelflib.c
@@ -37,7 +37,7 @@ do \
} \
} \
while (0);
-
+
/* Returns 0 if everything is ok, != 0 in case of error. */
int
process_elf_file (const char *file_name, const char *lib, int *flag,
@@ -46,15 +46,15 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
{
int i;
unsigned int j;
- int loadaddr;
+ ElfW(Addr) loadaddr;
unsigned int dynamic_addr;
size_t dynamic_size;
char *program_interpreter;
-
+
ElfW(Ehdr) *elf_header;
ElfW(Phdr) *elf_pheader, *segment;
ElfW(Dyn) *dynamic_segment, *dyn_entry;
- char *dynamic_strings;
+ char *dynamic_strings;
elf_header = (ElfW(Ehdr) *) file_contents;
*osversion = 0;
@@ -79,7 +79,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
elf_header->e_type);
return 1;
}
-
+
/* Get information from elf program header. */
elf_pheader = (ElfW(Phdr) *) (elf_header->e_phoff + file_contents);
check_ptr (elf_pheader);
@@ -87,7 +87,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
/* The library is an elf library, now search for soname and
libc5/libc6. */
*flag = FLAG_ELF;
-
+
loadaddr = -1;
dynamic_addr = 0;
dynamic_size = 0;
@@ -101,8 +101,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
{
case PT_LOAD:
if (loadaddr == -1)
- loadaddr = (segment->p_vaddr & 0xfffff000)
- - (segment->p_offset & 0xfffff000);
+ loadaddr = segment->p_vaddr - segment_p_offset;
break;
case PT_DYNAMIC:
@@ -144,7 +143,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
default:
break;
}
-
+
}
if (loadaddr == -1)
{
@@ -155,7 +154,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
/* Now we can read the dynamic sections. */
if (dynamic_size == 0)
return 1;
-
+
dynamic_segment = (ElfW(Dyn) *) (file_contents + dynamic_addr);
check_ptr (dynamic_segment);
@@ -187,7 +186,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
if (dyn_entry->d_tag == DT_NEEDED)
{
-
+
if (*flag == FLAG_ELF)
{
/* Check if this is enough to classify the binary. */
@@ -204,7 +203,7 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
else if (dyn_entry->d_tag == DT_SONAME)
*soname = xstrdup (name);
-
+
/* Do we have everything we need? */
if (*soname && *flag != FLAG_ELF)
return 0;