projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* aoutx.h (aout_link_check_ar_symbols): Formatting.
[deliverable/binutils-gdb.git]
/
bfd
/
elfcode.h
diff --git
a/bfd/elfcode.h
b/bfd/elfcode.h
index 889d25ab736e339e7fd8510fc2a90015788c5e22..5ef461018d97bbc8e08d9150a894ae26e60e50f8 100644
(file)
--- a/
bfd/elfcode.h
+++ b/
bfd/elfcode.h
@@
-1,6
+1,6
@@
/* ELF executable support for BFD.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
/* ELF executable support for BFD.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
, 2010
Free Software Foundation, Inc.
Written by Fred Fish @ Cygnus Support, from information published
Free Software Foundation, Inc.
Written by Fred Fish @ Cygnus Support, from information published
@@
-87,6
+87,7
@@
#define elf_core_file_failing_signal NAME(bfd_elf,core_file_failing_signal)
#define elf_core_file_matches_executable_p \
NAME(bfd_elf,core_file_matches_executable_p)
#define elf_core_file_failing_signal NAME(bfd_elf,core_file_failing_signal)
#define elf_core_file_matches_executable_p \
NAME(bfd_elf,core_file_matches_executable_p)
+#define elf_core_file_pid NAME(bfd_elf,core_file_pid)
#define elf_object_p NAME(bfd_elf,object_p)
#define elf_core_file_p NAME(bfd_elf,core_file_p)
#define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound)
#define elf_object_p NAME(bfd_elf,object_p)
#define elf_core_file_p NAME(bfd_elf,core_file_p)
#define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound)
@@
-176,8
+177,8
@@
elf_swap_symbol_in (bfd *abfd,
const void *pshn,
Elf_Internal_Sym *dst)
{
const void *pshn,
Elf_Internal_Sym *dst)
{
- const Elf_External_Sym *src = psrc;
- const Elf_External_Sym_Shndx *shndx = pshn;
+ const Elf_External_Sym *src =
(const Elf_External_Sym *)
psrc;
+ const Elf_External_Sym_Shndx *shndx =
(const Elf_External_Sym_Shndx *)
pshn;
int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
dst->st_name = H_GET_32 (abfd, src->st_name);
int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
dst->st_name = H_GET_32 (abfd, src->st_name);
@@
-210,7
+211,7
@@
elf_swap_symbol_out (bfd *abfd,
void *shndx)
{
unsigned int tmp;
void *shndx)
{
unsigned int tmp;
- Elf_External_Sym *dst = cdst;
+ Elf_External_Sym *dst =
(Elf_External_Sym *)
cdst;
H_PUT_32 (abfd, src->st_name, dst->st_name);
H_PUT_WORD (abfd, src->st_value, dst->st_value);
H_PUT_WORD (abfd, src->st_size, dst->st_size);
H_PUT_32 (abfd, src->st_name, dst->st_name);
H_PUT_WORD (abfd, src->st_value, dst->st_value);
H_PUT_WORD (abfd, src->st_size, dst->st_size);
@@
-279,7
+280,10
@@
elf_swap_ehdr_out (bfd *abfd,
H_PUT_32 (abfd, src->e_flags, dst->e_flags);
H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
H_PUT_32 (abfd, src->e_flags, dst->e_flags);
H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
- H_PUT_16 (abfd, src->e_phnum, dst->e_phnum);
+ tmp = src->e_phnum;
+ if (tmp > PN_XNUM)
+ tmp = PN_XNUM;
+ H_PUT_16 (abfd, tmp, dst->e_phnum);
H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
tmp = src->e_shnum;
if (tmp >= (SHN_LORESERVE & 0xffff))
H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
tmp = src->e_shnum;
if (tmp >= (SHN_LORESERVE & 0xffff))
@@
-439,7
+443,7
@@
elf_swap_dyn_in (bfd *abfd,
const void *p,
Elf_Internal_Dyn *dst)
{
const void *p,
Elf_Internal_Dyn *dst)
{
- const Elf_External_Dyn *src = p;
+ const Elf_External_Dyn *src =
(const Elf_External_Dyn *)
p;
dst->d_tag = H_GET_WORD (abfd, src->d_tag);
dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
dst->d_tag = H_GET_WORD (abfd, src->d_tag);
dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
@@
-450,7
+454,7
@@
elf_swap_dyn_out (bfd *abfd,
const Elf_Internal_Dyn *src,
void *p)
{
const Elf_Internal_Dyn *src,
void *p)
{
- Elf_External_Dyn *dst = p;
+ Elf_External_Dyn *dst =
(Elf_External_Dyn *)
p;
H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
@@
-701,6
+705,14
@@
elf_object_p (bfd *abfd)
goto got_wrong_format_error;
}
goto got_wrong_format_error;
}
+ /* And program headers. */
+ if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
+ {
+ i_ehdrp->e_phnum = i_shdr.sh_info;
+ if (i_ehdrp->e_phnum != i_shdr.sh_info)
+ goto got_wrong_format_error;
+ }
+
/* Sanity check that we can read all of the section headers.
It ought to be good enough to just read the last one. */
if (i_ehdrp->e_shnum != 1)
/* Sanity check that we can read all of the section headers.
It ought to be good enough to just read the last one. */
if (i_ehdrp->e_shnum != 1)
@@
-736,13
+748,13
@@
elf_object_p (bfd *abfd)
unsigned int num_sec;
amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
unsigned int num_sec;
amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
- i_shdrp = bfd_alloc (abfd, amt);
+ i_shdrp =
(Elf_Internal_Shdr *)
bfd_alloc (abfd, amt);
if (!i_shdrp)
goto got_no_match;
num_sec = i_ehdrp->e_shnum;
elf_numsections (abfd) = num_sec;
amt = sizeof (i_shdrp) * num_sec;
if (!i_shdrp)
goto got_no_match;
num_sec = i_ehdrp->e_shnum;
elf_numsections (abfd) = num_sec;
amt = sizeof (i_shdrp) * num_sec;
- elf_elfsections (abfd) = bfd_alloc (abfd, amt);
+ elf_elfsections (abfd) =
(Elf_Internal_Shdr **)
bfd_alloc (abfd, amt);
if (!elf_elfsections (abfd))
goto got_no_match;
if (!elf_elfsections (abfd))
goto got_no_match;
@@
-761,10
+773,13
@@
elf_object_p (bfd *abfd)
/* Sanity check sh_link and sh_info. */
if (i_shdrp[shindex].sh_link >= num_sec)
{
/* Sanity check sh_link and sh_info. */
if (i_shdrp[shindex].sh_link >= num_sec)
{
- /* PR 10478: Accept
sparc
binaries with a sh_link
+ /* PR 10478: Accept
Solaris
binaries with a sh_link
field set to SHN_BEFORE or SHN_AFTER. */
switch (ebd->elf_machine_code)
{
field set to SHN_BEFORE or SHN_AFTER. */
switch (ebd->elf_machine_code)
{
+ case EM_386:
+ case EM_486:
+ case EM_X86_64:
case EM_OLD_SPARCV9:
case EM_SPARC32PLUS:
case EM_SPARCV9:
case EM_OLD_SPARCV9:
case EM_SPARC32PLUS:
case EM_SPARCV9:
@@
-823,7
+838,7
@@
elf_object_p (bfd *abfd)
unsigned int i;
amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
unsigned int i;
amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
- elf_tdata (abfd)->phdr = bfd_alloc (abfd, amt);
+ elf_tdata (abfd)->phdr =
(Elf_Internal_Phdr *)
bfd_alloc (abfd, amt);
if (elf_tdata (abfd)->phdr == NULL)
goto got_no_match;
if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
if (elf_tdata (abfd)->phdr == NULL)
goto got_no_match;
if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
@@
-914,7
+929,7
@@
elf_object_p (bfd *abfd)
void
elf_write_relocs (bfd *abfd, asection *sec, void *data)
{
void
elf_write_relocs (bfd *abfd, asection *sec, void *data)
{
- bfd_boolean *failedp = data;
+ bfd_boolean *failedp =
(bfd_boolean *)
data;
Elf_Internal_Shdr *rela_hdr;
bfd_vma addr_offset;
void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
Elf_Internal_Shdr *rela_hdr;
bfd_vma addr_offset;
void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
@@
-944,10
+959,12
@@
elf_write_relocs (bfd *abfd, asection *sec, void *data)
if (sec->orelocation == NULL)
return;
if (sec->orelocation == NULL)
return;
- rela_hdr = &elf_section_data (sec)->rel_hdr;
+ rela_hdr = elf_section_data (sec)->rela.hdr;
+ if (rela_hdr == NULL)
+ rela_hdr = elf_section_data (sec)->rel.hdr;
rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
- rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
+ rela_hdr->contents =
(unsigned char *)
bfd_alloc (abfd, rela_hdr->sh_size);
if (rela_hdr->contents == NULL)
{
*failedp = TRUE;
if (rela_hdr->contents == NULL)
{
*failedp = TRUE;
@@
-1069,6
+1086,8
@@
elf_write_shdrs_and_ehdr (bfd *abfd)
/* Some fields in the first section header handle overflow of ehdr
fields. */
/* Some fields in the first section header handle overflow of ehdr
fields. */
+ if (i_ehdrp->e_phnum >= PN_XNUM)
+ i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
@@
-1077,7
+1096,7
@@
elf_write_shdrs_and_ehdr (bfd *abfd)
/* at this point we've concocted all the ELF sections... */
amt = i_ehdrp->e_shnum;
amt *= sizeof (*x_shdrp);
/* at this point we've concocted all the ELF sections... */
amt = i_ehdrp->e_shnum;
amt *= sizeof (*x_shdrp);
- x_shdrp = bfd_alloc (abfd, amt);
+ x_shdrp =
(Elf_External_Shdr *)
bfd_alloc (abfd, amt);
if (!x_shdrp)
return FALSE;
if (!x_shdrp)
return FALSE;
@@
-1205,7
+1224,7
@@
elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
amt = symcount;
amt *= sizeof (elf_symbol_type);
amt = symcount;
amt *= sizeof (elf_symbol_type);
- symbase = bfd_zalloc (abfd, amt);
+ symbase =
(elf_symbol_type *)
bfd_zalloc (abfd, amt);
if (symbase == (elf_symbol_type *) NULL)
goto error_return;
if (symbase == (elf_symbol_type *) NULL)
goto error_return;
@@
-1229,7
+1248,7
@@
elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
goto error_return;
if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
goto error_return;
- xverbuf = bfd_malloc (verhdr->sh_size);
+ xverbuf =
(Elf_External_Versym *)
bfd_malloc (verhdr->sh_size);
if (xverbuf == NULL && verhdr->sh_size != 0)
goto error_return;
if (xverbuf == NULL && verhdr->sh_size != 0)
goto error_return;
@@
-1418,7
+1437,7
@@
elf_slurp_reloc_table_from_section (bfd *abfd,
!= rel_hdr->sh_size))
goto error_return;
!= rel_hdr->sh_size))
goto error_return;
- native_relocs = allocated;
+ native_relocs =
(bfd_byte *)
allocated;
entsize = rel_hdr->sh_entsize;
BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
entsize = rel_hdr->sh_entsize;
BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
@@
-1449,7
+1468,7
@@
elf_slurp_reloc_table_from_section (bfd *abfd,
else
relent->address = rela.r_offset - asect->vma;
else
relent->address = rela.r_offset - asect->vma;
- if (ELF_R_SYM (rela.r_info) ==
0
)
+ if (ELF_R_SYM (rela.r_info) ==
STN_UNDEF
)
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
else if (ELF_R_SYM (rela.r_info) > symcount)
{
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
else if (ELF_R_SYM (rela.r_info) > symcount)
{
@@
-1513,13
+1532,13
@@
elf_slurp_reloc_table (bfd *abfd,
|| asect->reloc_count == 0)
return TRUE;
|| asect->reloc_count == 0)
return TRUE;
- rel_hdr =
&d->rel_
hdr;
- reloc_count =
NUM_SHDR_ENTRIES (rel_hdr)
;
- rel_hdr2 = d->rel
_hdr2
;
- reloc_count2 =
(rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0)
;
+ rel_hdr =
d->rel.
hdr;
+ reloc_count =
rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0
;
+ rel_hdr2 = d->rel
a.hdr
;
+ reloc_count2 =
rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0
;
BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
- BFD_ASSERT (
asect->rel_filepos == rel_hdr->sh_offset
+ BFD_ASSERT (
(rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
|| (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
}
|| (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
}
@@
-1539,14
+1558,15
@@
elf_slurp_reloc_table (bfd *abfd,
}
amt = (reloc_count + reloc_count2) * sizeof (arelent);
}
amt = (reloc_count + reloc_count2) * sizeof (arelent);
- relents = bfd_alloc (abfd, amt);
+ relents =
(arelent *)
bfd_alloc (abfd, amt);
if (relents == NULL)
return FALSE;
if (relents == NULL)
return FALSE;
- if (!elf_slurp_reloc_table_from_section (abfd, asect,
- rel_hdr, reloc_count,
- relents,
- symbols, dynamic))
+ if (rel_hdr
+ && !elf_slurp_reloc_table_from_section (abfd, asect,
+ rel_hdr, reloc_count,
+ relents,
+ symbols, dynamic))
return FALSE;
if (rel_hdr2
return FALSE;
if (rel_hdr2
@@
-1690,7
+1710,8
@@
NAME(_bfd_elf,bfd_from_remote_memory)
return NULL;
}
return NULL;
}
- x_phdrs = bfd_malloc (i_ehdr.e_phnum * (sizeof *x_phdrs + sizeof *i_phdrs));
+ x_phdrs = (Elf_External_Phdr *)
+ bfd_malloc (i_ehdr.e_phnum * (sizeof *x_phdrs + sizeof *i_phdrs));
if (x_phdrs == NULL)
{
bfd_set_error (bfd_error_no_memory);
if (x_phdrs == NULL)
{
bfd_set_error (bfd_error_no_memory);
@@
-1758,7
+1779,7
@@
NAME(_bfd_elf,bfd_from_remote_memory)
contents_size = last_phdr->p_offset + last_phdr->p_filesz;
/* Now we know the size of the whole image we want read in. */
contents_size = last_phdr->p_offset + last_phdr->p_filesz;
/* Now we know the size of the whole image we want read in. */
- contents = bfd_zmalloc (contents_size);
+ contents =
(bfd_byte *)
bfd_zmalloc (contents_size);
if (contents == NULL)
{
free (x_phdrs);
if (contents == NULL)
{
free (x_phdrs);
@@
-1803,7
+1824,7
@@
NAME(_bfd_elf,bfd_from_remote_memory)
memcpy (contents, &x_ehdr, sizeof x_ehdr);
/* Now we have a memory image of the ELF file contents. Make a BFD. */
memcpy (contents, &x_ehdr, sizeof x_ehdr);
/* Now we have a memory image of the ELF file contents. Make a BFD. */
- bim = bfd_malloc (sizeof (struct bfd_in_memory));
+ bim =
(struct bfd_in_memory *)
bfd_malloc (sizeof (struct bfd_in_memory));
if (bim == NULL)
{
free (contents);
if (bim == NULL)
{
free (contents);
@@
-1824,6
+1845,8
@@
NAME(_bfd_elf,bfd_from_remote_memory)
bim->buffer = contents;
nbfd->iostream = bim;
nbfd->flags = BFD_IN_MEMORY;
bim->buffer = contents;
nbfd->iostream = bim;
nbfd->flags = BFD_IN_MEMORY;
+ nbfd->iovec = &_bfd_memory_iovec;
+ nbfd->origin = 0;
nbfd->direction = read_direction;
nbfd->mtime = time (NULL);
nbfd->mtime_set = TRUE;
nbfd->direction = read_direction;
nbfd->mtime = time (NULL);
nbfd->mtime_set = TRUE;
This page took
0.045651 seconds
and
4
git commands to generate.