summaryrefslogtreecommitdiffstats
path: root/libelf/elf_begin.c
diff options
context:
space:
mode:
authorRoland McGrath <[email protected]>2005-08-13 20:56:07 +0000
committerRoland McGrath <[email protected]>2005-08-13 20:56:07 +0000
commite53d04af5fbf8486933821c81c8fe6637a546f48 (patch)
treede260d85ee015796448e391faac7250a8bb35ce6 /libelf/elf_begin.c
parent1bb18a3a9680af49dbf1056098bae8cf4624b565 (diff)
2005-08-13 Roland McGrath <[email protected]>
* ia64_symbol.c (ia64_machine_flag_check): New function. * libebl_ia64.h: Declare it. * ia64_init.c (ia64_init): Use it.
Diffstat (limited to 'libelf/elf_begin.c')
-rw-r--r--libelf/elf_begin.c122
1 files changed, 37 insertions, 85 deletions
diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c
index 56c7a481..404cbe83 100644
--- a/libelf/elf_begin.c
+++ b/libelf/elf_begin.c
@@ -69,11 +69,6 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
Elf64_Ehdr *e64;
void *p;
} ehdr;
- union
- {
- Elf32_Ehdr e32;
- Elf64_Ehdr e64;
- } ehdr_mem;
bool is32 = e_ident[EI_CLASS] == ELFCLASS32;
/* Make the ELF header available. */
@@ -88,17 +83,11 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
/* We have to read the data from the file. */
size_t len = is32 ? sizeof (Elf32_Ehdr) : sizeof (Elf64_Ehdr);
- if (likely (map_address != NULL))
- ehdr.p = memcpy (&ehdr_mem, (char *) map_address + offset, len);
- else
- {
- /* Fill it. */
- if ((size_t) TEMP_FAILURE_RETRY (pread (fildes, &ehdr_mem, len,
- offset)) != len)
- /* Failed reading. */
- return (size_t) -1l;
- ehdr.p = &ehdr_mem;
- }
+ ehdr.p = alloca (len);
+ /* Fill it. */
+ if ((size_t) pread (fildes, ehdr.p, len, offset) != len)
+ /* Failed reading. */
+ return (size_t) -1l;
if (e_ident[EI_DATA] != MY_ELFDATA)
{
@@ -131,27 +120,18 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
|| (((size_t) ((char *) map_address + offset))
& (__alignof__ (Elf32_Ehdr) - 1)) == 0))
/* We can directly access the memory. */
- result = ((Elf32_Shdr *) ((char *) map_address + ehdr.e32->e_shoff
+ result = ((Elf32_Shdr *) ((char *) map_address
+ + ehdr.e32->e_shoff
+ offset))->sh_size;
else
{
Elf32_Word size;
- if (likely (map_address != NULL))
- /* gcc will optimize the memcpy to a simple memory
- access while taking care of alignment issues. */
- memcpy (&size, &((Elf32_Shdr *) ((char *) map_address
- + ehdr.e32->e_shoff
- + offset))->sh_size,
- sizeof (Elf32_Word));
- else
- if (TEMP_FAILURE_RETRY (pread (fildes, &size,
- sizeof (Elf32_Word),
- offset + ehdr.e32->e_shoff
- + offsetof (Elf32_Shdr,
- sh_size)))
- != sizeof (Elf32_Word))
- return (size_t) -1l;
+ if (pread (fildes, &size, sizeof (Elf32_Word),
+ offset + ehdr.e32->e_shoff
+ + offsetof (Elf32_Shdr, sh_size))
+ != sizeof (Elf32_Word))
+ return (size_t) -1l;
if (e_ident[EI_DATA] != MY_ELFDATA)
CONVERT (size);
@@ -171,41 +151,29 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
/* Cannot read the first section header. */
return (size_t) -1l;
- Elf64_Xword size;
if (likely (map_address != NULL) && e_ident[EI_DATA] == MY_ELFDATA
&& (ALLOW_UNALIGNED
|| (((size_t) ((char *) map_address + offset))
& (__alignof__ (Elf64_Ehdr) - 1)) == 0))
/* We can directly access the memory. */
- size = ((Elf64_Shdr *) ((char *) map_address + ehdr.e64->e_shoff
- + offset))->sh_size;
+ result = ((Elf64_Shdr *) ((char *) map_address
+ + ehdr.e64->e_shoff
+ + offset))->sh_size;
else
{
- if (likely (map_address != NULL))
- /* gcc will optimize the memcpy to a simple memory
- access while taking care of alignment issues. */
- memcpy (&size, &((Elf64_Shdr *) ((char *) map_address
- + ehdr.e64->e_shoff
- + offset))->sh_size,
- sizeof (Elf64_Xword));
- else
- if (TEMP_FAILURE_RETRY (pread (fildes, &size,
- sizeof (Elf64_Word),
- offset + ehdr.e64->e_shoff
- + offsetof (Elf64_Shdr,
- sh_size)))
- != sizeof (Elf64_Xword))
- return (size_t) -1l;
+ Elf64_Word size;
+
+ if (pread (fildes, &size, sizeof (Elf64_Word),
+ offset + ehdr.e64->e_shoff
+ + offsetof (Elf64_Shdr, sh_size))
+ != sizeof (Elf64_Word))
+ return (size_t) -1l;
if (e_ident[EI_DATA] != MY_ELFDATA)
CONVERT (size);
- }
-
- if (size > ~((GElf_Word) 0))
- /* Invalid value, it is too large. */
- return (size_t) -1l;
- result = size;
+ result = size;
+ }
}
}
@@ -220,7 +188,6 @@ file_read_elf (int fildes, void *map_address, off_t offset, size_t maxsize,
{
/* We only read the ELF header now. */
unsigned char *e_ident;
- unsigned char e_ident_mem[EI_NIDENT];
size_t scncnt;
Elf *elf;
@@ -230,10 +197,9 @@ file_read_elf (int fildes, void *map_address, off_t offset, size_t maxsize,
e_ident = (unsigned char *) map_address + offset;
else
{
- e_ident = e_ident_mem;
+ e_ident = (unsigned char *) alloca (EI_NIDENT);
- if (TEMP_FAILURE_RETRY (pread (fildes, e_ident, EI_NIDENT, offset))
- != EI_NIDENT)
+ if (pread (fildes, e_ident, EI_NIDENT, offset) != EI_NIDENT)
{
__libelf_seterrno (ELF_E_READ_ERROR);
return NULL;
@@ -314,21 +280,14 @@ file_read_elf (int fildes, void *map_address, off_t offset, size_t maxsize,
}
else
{
- if (likely (map_address != NULL))
- /* Copy the data. */
- memcpy (&elf->state.elf32.ehdr_mem,
- (char *) map_address + offset, sizeof (Elf32_Ehdr));
- else
- /* Read the data. */
- if (TEMP_FAILURE_RETRY (pread (elf->fildes,
- &elf->state.elf32.ehdr_mem,
- sizeof (Elf32_Ehdr), offset))
- != sizeof (Elf32_Ehdr))
- {
- /* We must be able to read the ELF header. */
- __libelf_seterrno (ELF_E_INVALID_FILE);
- return NULL;
- }
+ /* Read the data. */
+ if (pread (elf->fildes, &elf->state.elf32.ehdr_mem,
+ sizeof (Elf32_Ehdr), offset) != sizeof (Elf32_Ehdr))
+ {
+ /* We must be able to read the ELF header. */
+ __libelf_seterrno (ELF_E_INVALID_FILE);
+ return NULL;
+ }
if (e_ident[EI_DATA] != MY_ELFDATA)
{
@@ -406,16 +365,9 @@ file_read_elf (int fildes, void *map_address, off_t offset, size_t maxsize,
}
else
{
- if (likely (map_address != NULL))
- /* Copy the data. */
- memcpy (&elf->state.elf64.ehdr_mem,
- (char *) map_address + offset, sizeof (Elf64_Ehdr));
- else
- /* Read the data. */
- if (TEMP_FAILURE_RETRY (pread (elf->fildes,
- &elf->state.elf64.ehdr_mem,
- sizeof (Elf64_Ehdr), offset))
- != sizeof (Elf64_Ehdr))
+ /* Read the data. */
+ if (pread (elf->fildes, &elf->state.elf64.ehdr_mem,
+ sizeof (Elf64_Ehdr), offset) != sizeof (Elf64_Ehdr))
{
/* We must be able to read the ELF header. */
__libelf_seterrno (ELF_E_INVALID_FILE);