mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 22:07:58 +08:00
2000-09-07 Kazu Hirata <kazu@hxi.com>
* elf.c: Fix formatting.
This commit is contained in:
@ -1,3 +1,7 @@
|
|||||||
|
2000-09-07 Kazu Hirata <kazu@hxi.com>
|
||||||
|
|
||||||
|
* elf.c: Fix formatting.
|
||||||
|
|
||||||
2000-09-07 Alexandre Oliva <aoliva@redhat.com>
|
2000-09-07 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
|
||||||
* config.bfd (sh-*-linux*): Added.
|
* config.bfd (sh-*-linux*): Added.
|
||||||
|
314
bfd/elf.c
314
bfd/elf.c
@ -229,11 +229,11 @@ bfd_elf_hash (namearg)
|
|||||||
|
|
||||||
/* Read a specified number of bytes at a specified offset in an ELF
|
/* Read a specified number of bytes at a specified offset in an ELF
|
||||||
file, into a newly allocated buffer, and return a pointer to the
|
file, into a newly allocated buffer, and return a pointer to the
|
||||||
buffer. */
|
buffer. */
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
elf_read (abfd, offset, size)
|
elf_read (abfd, offset, size)
|
||||||
bfd * abfd;
|
bfd *abfd;
|
||||||
long offset;
|
long offset;
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
{
|
{
|
||||||
@ -254,31 +254,31 @@ elf_read (abfd, offset, size)
|
|||||||
|
|
||||||
boolean
|
boolean
|
||||||
bfd_elf_mkobject (abfd)
|
bfd_elf_mkobject (abfd)
|
||||||
bfd * abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
/* this just does initialization */
|
/* This just does initialization. */
|
||||||
/* coff_mkobject zalloc's space for tdata.coff_obj_data ... */
|
/* coff_mkobject zalloc's space for tdata.coff_obj_data ... */
|
||||||
elf_tdata (abfd) = (struct elf_obj_tdata *)
|
elf_tdata (abfd) = (struct elf_obj_tdata *)
|
||||||
bfd_zalloc (abfd, sizeof (struct elf_obj_tdata));
|
bfd_zalloc (abfd, sizeof (struct elf_obj_tdata));
|
||||||
if (elf_tdata (abfd) == 0)
|
if (elf_tdata (abfd) == 0)
|
||||||
return false;
|
return false;
|
||||||
/* since everything is done at close time, do we need any
|
/* Since everything is done at close time, do we need any
|
||||||
initialization? */
|
initialization? */
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
bfd_elf_mkcorefile (abfd)
|
bfd_elf_mkcorefile (abfd)
|
||||||
bfd * abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
/* I think this can be done just like an object file. */
|
/* I think this can be done just like an object file. */
|
||||||
return bfd_elf_mkobject (abfd);
|
return bfd_elf_mkobject (abfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
bfd_elf_get_str_section (abfd, shindex)
|
bfd_elf_get_str_section (abfd, shindex)
|
||||||
bfd * abfd;
|
bfd *abfd;
|
||||||
unsigned int shindex;
|
unsigned int shindex;
|
||||||
{
|
{
|
||||||
Elf_Internal_Shdr **i_shdrp;
|
Elf_Internal_Shdr **i_shdrp;
|
||||||
@ -293,7 +293,7 @@ bfd_elf_get_str_section (abfd, shindex)
|
|||||||
shstrtab = (char *) i_shdrp[shindex]->contents;
|
shstrtab = (char *) i_shdrp[shindex]->contents;
|
||||||
if (shstrtab == NULL)
|
if (shstrtab == NULL)
|
||||||
{
|
{
|
||||||
/* No cached one, attempt to read, and cache what we read. */
|
/* No cached one, attempt to read, and cache what we read. */
|
||||||
offset = i_shdrp[shindex]->sh_offset;
|
offset = i_shdrp[shindex]->sh_offset;
|
||||||
shstrtabsize = i_shdrp[shindex]->sh_size;
|
shstrtabsize = i_shdrp[shindex]->sh_size;
|
||||||
shstrtab = elf_read (abfd, offset, shstrtabsize);
|
shstrtab = elf_read (abfd, offset, shstrtabsize);
|
||||||
@ -304,7 +304,7 @@ bfd_elf_get_str_section (abfd, shindex)
|
|||||||
|
|
||||||
char *
|
char *
|
||||||
bfd_elf_string_from_elf_section (abfd, shindex, strindex)
|
bfd_elf_string_from_elf_section (abfd, shindex, strindex)
|
||||||
bfd * abfd;
|
bfd *abfd;
|
||||||
unsigned int shindex;
|
unsigned int shindex;
|
||||||
unsigned int strindex;
|
unsigned int strindex;
|
||||||
{
|
{
|
||||||
@ -384,7 +384,7 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name)
|
|||||||
/* The debugging sections appear to be recognized only by name, not
|
/* The debugging sections appear to be recognized only by name, not
|
||||||
any sort of flag. */
|
any sort of flag. */
|
||||||
{
|
{
|
||||||
const char * debug_sec_names [] =
|
const char *debug_sec_names [] =
|
||||||
{
|
{
|
||||||
".debug",
|
".debug",
|
||||||
".gnu.linkonce.wi.",
|
".gnu.linkonce.wi.",
|
||||||
@ -472,7 +472,7 @@ DESCRIPTION
|
|||||||
|
|
||||||
struct elf_internal_shdr *
|
struct elf_internal_shdr *
|
||||||
bfd_elf_find_section (abfd, name)
|
bfd_elf_find_section (abfd, name)
|
||||||
bfd * abfd;
|
bfd *abfd;
|
||||||
char *name;
|
char *name;
|
||||||
{
|
{
|
||||||
Elf_Internal_Shdr **i_shdrp;
|
Elf_Internal_Shdr **i_shdrp;
|
||||||
@ -512,7 +512,6 @@ const char *const bfd_elf_section_type_names[] = {
|
|||||||
function. It just short circuits the reloc if producing
|
function. It just short circuits the reloc if producing
|
||||||
relocateable output against an external symbol. */
|
relocateable output against an external symbol. */
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
bfd_reloc_status_type
|
bfd_reloc_status_type
|
||||||
bfd_elf_generic_reloc (abfd,
|
bfd_elf_generic_reloc (abfd,
|
||||||
reloc_entry,
|
reloc_entry,
|
||||||
@ -804,12 +803,12 @@ bfd_elf_print_symbol (abfd, filep, symbol, how)
|
|||||||
CONST char *name = NULL;
|
CONST char *name = NULL;
|
||||||
struct elf_backend_data *bed;
|
struct elf_backend_data *bed;
|
||||||
unsigned char st_other;
|
unsigned char st_other;
|
||||||
|
|
||||||
section_name = symbol->section ? symbol->section->name : "(*none*)";
|
section_name = symbol->section ? symbol->section->name : "(*none*)";
|
||||||
|
|
||||||
bed = get_elf_backend_data (abfd);
|
bed = get_elf_backend_data (abfd);
|
||||||
if (bed->elf_backend_print_symbol_all)
|
if (bed->elf_backend_print_symbol_all)
|
||||||
name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
|
name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
|
||||||
|
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
{
|
{
|
||||||
@ -880,7 +879,7 @@ bfd_elf_print_symbol (abfd, filep, symbol, how)
|
|||||||
|
|
||||||
/* If the st_other field is not zero, print it. */
|
/* If the st_other field is not zero, print it. */
|
||||||
st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
|
st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
|
||||||
|
|
||||||
switch (st_other)
|
switch (st_other)
|
||||||
{
|
{
|
||||||
case 0: break;
|
case 0: break;
|
||||||
@ -1222,7 +1221,7 @@ _bfd_elf_stringtab_init ()
|
|||||||
|
|
||||||
/* ELF .o/exec file reading */
|
/* ELF .o/exec file reading */
|
||||||
|
|
||||||
/* Create a new bfd section from an ELF section header. */
|
/* Create a new bfd section from an ELF section header. */
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
bfd_section_from_shdr (abfd, shindex)
|
bfd_section_from_shdr (abfd, shindex)
|
||||||
@ -1395,9 +1394,9 @@ bfd_section_from_shdr (abfd, shindex)
|
|||||||
/* If this reloc section does not use the main symbol table we
|
/* If this reloc section does not use the main symbol table we
|
||||||
don't treat it as a reloc section. BFD can't adequately
|
don't treat it as a reloc section. BFD can't adequately
|
||||||
represent such a section, so at least for now, we don't
|
represent such a section, so at least for now, we don't
|
||||||
try. We just present it as a normal section. We also
|
try. We just present it as a normal section. We also
|
||||||
can't use it as a reloc section if it points to the null
|
can't use it as a reloc section if it points to the null
|
||||||
section. */
|
section. */
|
||||||
if (hdr->sh_link != elf_onesymtab (abfd) || hdr->sh_info == SHN_UNDEF)
|
if (hdr->sh_link != elf_onesymtab (abfd) || hdr->sh_info == SHN_UNDEF)
|
||||||
return _bfd_elf_make_section_from_shdr (abfd, hdr, name);
|
return _bfd_elf_make_section_from_shdr (abfd, hdr, name);
|
||||||
|
|
||||||
@ -1492,7 +1491,7 @@ _bfd_elf_new_section_hook (abfd, sec)
|
|||||||
sec->used_by_bfd = (PTR) sdata;
|
sec->used_by_bfd = (PTR) sdata;
|
||||||
|
|
||||||
/* Indicate whether or not this section should use RELA relocations. */
|
/* Indicate whether or not this section should use RELA relocations. */
|
||||||
sdata->use_rela_p
|
sdata->use_rela_p
|
||||||
= get_elf_backend_data (abfd)->default_use_rela_p;
|
= get_elf_backend_data (abfd)->default_use_rela_p;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1555,7 +1554,7 @@ _bfd_elf_make_section_from_phdr (abfd, hdr, index, typename)
|
|||||||
if (hdr->p_flags & PF_X)
|
if (hdr->p_flags & PF_X)
|
||||||
{
|
{
|
||||||
/* FIXME: all we known is that it has execute PERMISSION,
|
/* FIXME: all we known is that it has execute PERMISSION,
|
||||||
may be data. */
|
may be data. */
|
||||||
newsect->flags |= SEC_CODE;
|
newsect->flags |= SEC_CODE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1627,7 +1626,7 @@ bfd_section_from_phdr (abfd, hdr, index)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
/* Check for any processor-specific program segment types.
|
/* Check for any processor-specific program segment types.
|
||||||
If no handler for them, default to making "segment" sections. */
|
If no handler for them, default to making "segment" sections. */
|
||||||
bed = get_elf_backend_data (abfd);
|
bed = get_elf_backend_data (abfd);
|
||||||
if (bed->elf_backend_section_from_phdr)
|
if (bed->elf_backend_section_from_phdr)
|
||||||
return (*bed->elf_backend_section_from_phdr) (abfd, hdr, index);
|
return (*bed->elf_backend_section_from_phdr) (abfd, hdr, index);
|
||||||
@ -1675,7 +1674,6 @@ _bfd_elf_init_reloc_shdr (abfd, rel_hdr, asect, use_rela_p)
|
|||||||
|
|
||||||
/* Set up an ELF internal section header for a section. */
|
/* Set up an ELF internal section header for a section. */
|
||||||
|
|
||||||
/*ARGSUSED*/
|
|
||||||
static void
|
static void
|
||||||
elf_fake_sections (abfd, asect, failedptrarg)
|
elf_fake_sections (abfd, asect, failedptrarg)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
@ -1814,11 +1812,11 @@ elf_fake_sections (abfd, asect, failedptrarg)
|
|||||||
/* If the section has relocs, set up a section header for the
|
/* If the section has relocs, set up a section header for the
|
||||||
SHT_REL[A] section. If two relocation sections are required for
|
SHT_REL[A] section. If two relocation sections are required for
|
||||||
this section, it is up to the processor-specific back-end to
|
this section, it is up to the processor-specific back-end to
|
||||||
create the other. */
|
create the other. */
|
||||||
if ((asect->flags & SEC_RELOC) != 0
|
if ((asect->flags & SEC_RELOC) != 0
|
||||||
&& !_bfd_elf_init_reloc_shdr (abfd,
|
&& !_bfd_elf_init_reloc_shdr (abfd,
|
||||||
&elf_section_data (asect)->rel_hdr,
|
&elf_section_data (asect)->rel_hdr,
|
||||||
asect,
|
asect,
|
||||||
elf_section_data (asect)->use_rela_p))
|
elf_section_data (asect)->use_rela_p))
|
||||||
*failedptr = true;
|
*failedptr = true;
|
||||||
}
|
}
|
||||||
@ -2058,7 +2056,7 @@ elf_map_symbols (abfd)
|
|||||||
for (idx = 0; idx < symcount; idx++)
|
for (idx = 0; idx < symcount; idx++)
|
||||||
{
|
{
|
||||||
sym = syms[idx];
|
sym = syms[idx];
|
||||||
|
|
||||||
if ((sym->flags & BSF_SECTION_SYM) != 0
|
if ((sym->flags & BSF_SECTION_SYM) != 0
|
||||||
&& sym->value == 0)
|
&& sym->value == 0)
|
||||||
{
|
{
|
||||||
@ -2072,7 +2070,7 @@ elf_map_symbols (abfd)
|
|||||||
{
|
{
|
||||||
if (sec->output_offset != 0)
|
if (sec->output_offset != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
sec = sec->output_section;
|
sec = sec->output_section;
|
||||||
|
|
||||||
/* Empty sections in the input files may have had a section
|
/* Empty sections in the input files may have had a section
|
||||||
@ -3368,10 +3366,10 @@ prep_headers (abfd)
|
|||||||
case 0: i_ehdrp->e_machine = EM_CYGNUS_V850; break;
|
case 0: i_ehdrp->e_machine = EM_CYGNUS_V850; break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case bfd_arch_arc:
|
case bfd_arch_arc:
|
||||||
i_ehdrp->e_machine = EM_CYGNUS_ARC;
|
i_ehdrp->e_machine = EM_CYGNUS_ARC;
|
||||||
break;
|
break;
|
||||||
case bfd_arch_arm:
|
case bfd_arch_arm:
|
||||||
i_ehdrp->e_machine = EM_ARM;
|
i_ehdrp->e_machine = EM_ARM;
|
||||||
break;
|
break;
|
||||||
case bfd_arch_m32r:
|
case bfd_arch_m32r:
|
||||||
@ -3396,24 +3394,24 @@ prep_headers (abfd)
|
|||||||
i_ehdrp->e_version = bed->s->ev_current;
|
i_ehdrp->e_version = bed->s->ev_current;
|
||||||
i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
|
i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
|
||||||
|
|
||||||
/* no program header, for now. */
|
/* No program header, for now. */
|
||||||
i_ehdrp->e_phoff = 0;
|
i_ehdrp->e_phoff = 0;
|
||||||
i_ehdrp->e_phentsize = 0;
|
i_ehdrp->e_phentsize = 0;
|
||||||
i_ehdrp->e_phnum = 0;
|
i_ehdrp->e_phnum = 0;
|
||||||
|
|
||||||
/* each bfd section is section header entry */
|
/* Each bfd section is section header entry. */
|
||||||
i_ehdrp->e_entry = bfd_get_start_address (abfd);
|
i_ehdrp->e_entry = bfd_get_start_address (abfd);
|
||||||
i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
|
i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
|
||||||
|
|
||||||
/* if we're building an executable, we'll need a program header table */
|
/* If we're building an executable, we'll need a program header table. */
|
||||||
if (abfd->flags & EXEC_P)
|
if (abfd->flags & EXEC_P)
|
||||||
{
|
{
|
||||||
/* it all happens later */
|
/* It all happens later. */
|
||||||
#if 0
|
#if 0
|
||||||
i_ehdrp->e_phentsize = sizeof (Elf_External_Phdr);
|
i_ehdrp->e_phentsize = sizeof (Elf_External_Phdr);
|
||||||
|
|
||||||
/* elf_build_phdrs() returns a (NULL-terminated) array of
|
/* elf_build_phdrs() returns a (NULL-terminated) array of
|
||||||
Elf_Internal_Phdrs */
|
Elf_Internal_Phdrs. */
|
||||||
i_phdrp = elf_build_phdrs (abfd, i_ehdrp, i_shdrp, &i_ehdrp->e_phnum);
|
i_phdrp = elf_build_phdrs (abfd, i_ehdrp, i_shdrp, &i_ehdrp->e_phnum);
|
||||||
i_ehdrp->e_phoff = outbase;
|
i_ehdrp->e_phoff = outbase;
|
||||||
outbase += i_ehdrp->e_phentsize * i_ehdrp->e_phnum;
|
outbase += i_ehdrp->e_phentsize * i_ehdrp->e_phnum;
|
||||||
@ -3493,7 +3491,7 @@ _bfd_elf_write_object_contents (abfd)
|
|||||||
|
|
||||||
_bfd_elf_assign_file_positions_for_relocs (abfd);
|
_bfd_elf_assign_file_positions_for_relocs (abfd);
|
||||||
|
|
||||||
/* After writing the headers, we need to write the sections too... */
|
/* After writing the headers, we need to write the sections too... */
|
||||||
for (count = 1; count < i_ehdrp->e_shnum; count++)
|
for (count = 1; count < i_ehdrp->e_shnum; count++)
|
||||||
{
|
{
|
||||||
if (bed->elf_backend_section_processing)
|
if (bed->elf_backend_section_processing)
|
||||||
@ -3524,10 +3522,12 @@ boolean
|
|||||||
_bfd_elf_write_corefile_contents (abfd)
|
_bfd_elf_write_corefile_contents (abfd)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
/* Hopefully this can be done just like an object file. */
|
/* Hopefully this can be done just like an object file. */
|
||||||
return _bfd_elf_write_object_contents (abfd);
|
return _bfd_elf_write_object_contents (abfd);
|
||||||
}
|
}
|
||||||
/* given a section, search the header to find them... */
|
|
||||||
|
/* Given a section, search the header to find them. */
|
||||||
|
|
||||||
int
|
int
|
||||||
_bfd_elf_section_from_bfd_section (abfd, asect)
|
_bfd_elf_section_from_bfd_section (abfd, asect)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
@ -3649,7 +3649,7 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
struct elf_segment_map * phdr_adjust_seg = NULL;
|
struct elf_segment_map * phdr_adjust_seg = NULL;
|
||||||
unsigned int phdr_adjust_num = 0;
|
unsigned int phdr_adjust_num = 0;
|
||||||
|
|
||||||
if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|
if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|
||||||
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
|
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -3659,7 +3659,7 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
iehdr = elf_elfheader (ibfd);
|
iehdr = elf_elfheader (ibfd);
|
||||||
|
|
||||||
map_first = NULL;
|
map_first = NULL;
|
||||||
pointer_to_map = & map_first;
|
pointer_to_map = &map_first;
|
||||||
|
|
||||||
num_segments = elf_elfheader (ibfd)->e_phnum;
|
num_segments = elf_elfheader (ibfd)->e_phnum;
|
||||||
maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
|
maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
|
||||||
@ -3675,7 +3675,7 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
(section->vma >= segment->p_vaddr \
|
(section->vma >= segment->p_vaddr \
|
||||||
&& (section->vma + section->_raw_size) \
|
&& (section->vma + section->_raw_size) \
|
||||||
<= (SEGMENT_END (segment, segment->p_vaddr)))
|
<= (SEGMENT_END (segment, segment->p_vaddr)))
|
||||||
|
|
||||||
/* Returns true if the given section is contained within
|
/* Returns true if the given section is contained within
|
||||||
the given segment. LMA addresses are compared. */
|
the given segment. LMA addresses are compared. */
|
||||||
#define IS_CONTAINED_BY_LMA(section, segment, base) \
|
#define IS_CONTAINED_BY_LMA(section, segment, base) \
|
||||||
@ -3683,7 +3683,7 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
&& (section->lma + section->_raw_size) \
|
&& (section->lma + section->_raw_size) \
|
||||||
<= SEGMENT_END (segment, base))
|
<= SEGMENT_END (segment, base))
|
||||||
|
|
||||||
/* Special case: corefile "NOTE" section containing regs, prpsinfo etc. */
|
/* Special case: corefile "NOTE" section containing regs, prpsinfo etc. */
|
||||||
#define IS_COREFILE_NOTE(p, s) \
|
#define IS_COREFILE_NOTE(p, s) \
|
||||||
(p->p_type == PT_NOTE \
|
(p->p_type == PT_NOTE \
|
||||||
&& bfd_get_format (ibfd) == bfd_core \
|
&& bfd_get_format (ibfd) == bfd_core \
|
||||||
@ -3736,39 +3736,40 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
parameters to objcopy. */
|
parameters to objcopy. */
|
||||||
for (i = 0, segment = elf_tdata (ibfd)->phdr;
|
for (i = 0, segment = elf_tdata (ibfd)->phdr;
|
||||||
i < num_segments;
|
i < num_segments;
|
||||||
i ++, segment ++)
|
i++, segment++)
|
||||||
{
|
{
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
Elf_Internal_Phdr * segment2;
|
Elf_Internal_Phdr *segment2;
|
||||||
|
|
||||||
if (segment->p_type != PT_LOAD)
|
if (segment->p_type != PT_LOAD)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Determine if this segment overlaps any previous segments. */
|
/* Determine if this segment overlaps any previous segments. */
|
||||||
for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j ++, segment2 ++)
|
for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2 ++)
|
||||||
{
|
{
|
||||||
bfd_signed_vma extra_length;
|
bfd_signed_vma extra_length;
|
||||||
|
|
||||||
if (segment2->p_type != PT_LOAD
|
if (segment2->p_type != PT_LOAD
|
||||||
|| ! SEGMENT_OVERLAPS (segment, segment2))
|
|| ! SEGMENT_OVERLAPS (segment, segment2))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Merge the two segments together. */
|
/* Merge the two segments together. */
|
||||||
if (segment2->p_vaddr < segment->p_vaddr)
|
if (segment2->p_vaddr < segment->p_vaddr)
|
||||||
{
|
{
|
||||||
/* Extend SEGMENT2 to include SEGMENT and then delete SEGMENT. */
|
/* Extend SEGMENT2 to include SEGMENT and then delete
|
||||||
|
SEGMENT. */
|
||||||
extra_length =
|
extra_length =
|
||||||
SEGMENT_END (segment, segment->p_vaddr)
|
SEGMENT_END (segment, segment->p_vaddr)
|
||||||
- SEGMENT_END (segment2, segment2->p_vaddr);
|
- SEGMENT_END (segment2, segment2->p_vaddr);
|
||||||
|
|
||||||
if (extra_length > 0)
|
if (extra_length > 0)
|
||||||
{
|
{
|
||||||
segment2->p_memsz += extra_length;
|
segment2->p_memsz += extra_length;
|
||||||
segment2->p_filesz += extra_length;
|
segment2->p_filesz += extra_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
segment->p_type = PT_NULL;
|
segment->p_type = PT_NULL;
|
||||||
|
|
||||||
/* Since we have deleted P we must restart the outer loop. */
|
/* Since we have deleted P we must restart the outer loop. */
|
||||||
i = 0;
|
i = 0;
|
||||||
segment = elf_tdata (ibfd)->phdr;
|
segment = elf_tdata (ibfd)->phdr;
|
||||||
@ -3776,22 +3777,23 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Extend SEGMENT to include SEGMENT2 and then delete SEGMENT2. */
|
/* Extend SEGMENT to include SEGMENT2 and then delete
|
||||||
|
SEGMENT2. */
|
||||||
extra_length =
|
extra_length =
|
||||||
SEGMENT_END (segment2, segment2->p_vaddr)
|
SEGMENT_END (segment2, segment2->p_vaddr)
|
||||||
- SEGMENT_END (segment, segment->p_vaddr);
|
- SEGMENT_END (segment, segment->p_vaddr);
|
||||||
|
|
||||||
if (extra_length > 0)
|
if (extra_length > 0)
|
||||||
{
|
{
|
||||||
segment->p_memsz += extra_length;
|
segment->p_memsz += extra_length;
|
||||||
segment->p_filesz += extra_length;
|
segment->p_filesz += extra_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
segment2->p_type = PT_NULL;
|
segment2->p_type = PT_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The second scan attempts to assign sections to segments. */
|
/* The second scan attempts to assign sections to segments. */
|
||||||
for (i = 0, segment = elf_tdata (ibfd)->phdr;
|
for (i = 0, segment = elf_tdata (ibfd)->phdr;
|
||||||
i < num_segments;
|
i < num_segments;
|
||||||
@ -3807,12 +3809,12 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
|
|
||||||
if (segment->p_type == PT_NULL)
|
if (segment->p_type == PT_NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Compute how many sections might be placed into this segment. */
|
/* Compute how many sections might be placed into this segment. */
|
||||||
section_count = 0;
|
section_count = 0;
|
||||||
for (section = ibfd->sections; section != NULL; section = section->next)
|
for (section = ibfd->sections; section != NULL; section = section->next)
|
||||||
if (INCLUDE_SECTION_IN_SEGMENT (section, segment))
|
if (INCLUDE_SECTION_IN_SEGMENT (section, segment))
|
||||||
++ section_count;
|
++section_count;
|
||||||
|
|
||||||
/* Allocate a segment map big enough to contain all of the
|
/* Allocate a segment map big enough to contain all of the
|
||||||
sections we have selected. */
|
sections we have selected. */
|
||||||
@ -3846,7 +3848,7 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
&& (segment->p_offset + segment->p_filesz
|
&& (segment->p_offset + segment->p_filesz
|
||||||
>= ((bfd_vma) iehdr->e_phoff
|
>= ((bfd_vma) iehdr->e_phoff
|
||||||
+ iehdr->e_phnum * iehdr->e_phentsize)));
|
+ iehdr->e_phnum * iehdr->e_phentsize)));
|
||||||
|
|
||||||
if (segment->p_type == PT_LOAD && map->includes_phdrs)
|
if (segment->p_type == PT_LOAD && map->includes_phdrs)
|
||||||
phdr_included = true;
|
phdr_included = true;
|
||||||
}
|
}
|
||||||
@ -3862,8 +3864,8 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
bfd_get_filename (ibfd));
|
bfd_get_filename (ibfd));
|
||||||
|
|
||||||
map->count = 0;
|
map->count = 0;
|
||||||
* pointer_to_map = map;
|
*pointer_to_map = map;
|
||||||
pointer_to_map = & map->next;
|
pointer_to_map = &map->next;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -3966,8 +3968,8 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
the list of built segments and carry on to process the next
|
the list of built segments and carry on to process the next
|
||||||
program header in the input BFD. */
|
program header in the input BFD. */
|
||||||
map->count = section_count;
|
map->count = section_count;
|
||||||
* pointer_to_map = map;
|
*pointer_to_map = map;
|
||||||
pointer_to_map = & map->next;
|
pointer_to_map = &map->next;
|
||||||
|
|
||||||
free (sections);
|
free (sections);
|
||||||
continue;
|
continue;
|
||||||
@ -4032,7 +4034,7 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
output_section = section->output_section;
|
output_section = section->output_section;
|
||||||
|
|
||||||
BFD_ASSERT (output_section != NULL);
|
BFD_ASSERT (output_section != NULL);
|
||||||
|
|
||||||
if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
|
if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
|
||||||
|| IS_COREFILE_NOTE (segment, section))
|
|| IS_COREFILE_NOTE (segment, section))
|
||||||
{
|
{
|
||||||
@ -4081,8 +4083,8 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
BFD_ASSERT (map->count > 0);
|
BFD_ASSERT (map->count > 0);
|
||||||
|
|
||||||
/* Add the current segment to the list of built segments. */
|
/* Add the current segment to the list of built segments. */
|
||||||
* pointer_to_map = map;
|
*pointer_to_map = map;
|
||||||
pointer_to_map = & map->next;
|
pointer_to_map = &map->next;
|
||||||
|
|
||||||
if (isec < section_count)
|
if (isec < section_count)
|
||||||
{
|
{
|
||||||
@ -4136,20 +4138,21 @@ copy_private_bfd_data (ibfd, obfd)
|
|||||||
if (phdr_adjust_seg != NULL)
|
if (phdr_adjust_seg != NULL)
|
||||||
{
|
{
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
|
|
||||||
for (count = 0, map = map_first; map != NULL; map = map->next)
|
for (count = 0, map = map_first; map != NULL; map = map->next)
|
||||||
count ++;
|
count++;
|
||||||
|
|
||||||
if (count > phdr_adjust_num)
|
if (count > phdr_adjust_num)
|
||||||
phdr_adjust_seg->p_paddr
|
phdr_adjust_seg->p_paddr
|
||||||
-= (count - phdr_adjust_num) * iehdr->e_phentsize;
|
-= (count - phdr_adjust_num) * iehdr->e_phentsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* Final Step: Sort the segments into ascending order of physical address. */
|
/* Final Step: Sort the segments into ascending order of physical
|
||||||
|
address. */
|
||||||
if (map_first != NULL)
|
if (map_first != NULL)
|
||||||
{
|
{
|
||||||
struct elf_segment_map * prev;
|
struct elf_segment_map *prev;
|
||||||
|
|
||||||
prev = map_first;
|
prev = map_first;
|
||||||
for (map = map_first->next; map != NULL; prev = map, map = map->next)
|
for (map = map_first->next; map != NULL; prev = map, map = map->next)
|
||||||
@ -4298,7 +4301,7 @@ swap_out_syms (abfd, sttp, relocatable_p)
|
|||||||
if (!elf_map_symbols (abfd))
|
if (!elf_map_symbols (abfd))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Dump out the symtabs. */
|
/* Dump out the symtabs. */
|
||||||
{
|
{
|
||||||
int symcount = bfd_get_symcount (abfd);
|
int symcount = bfd_get_symcount (abfd);
|
||||||
asymbol **syms = bfd_get_outsymbols (abfd);
|
asymbol **syms = bfd_get_outsymbols (abfd);
|
||||||
@ -4989,7 +4992,7 @@ _bfd_elf_find_nearest_line (abfd,
|
|||||||
asymbol **p;
|
asymbol **p;
|
||||||
|
|
||||||
if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
|
if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
|
||||||
filename_ptr, functionname_ptr,
|
filename_ptr, functionname_ptr,
|
||||||
line_ptr))
|
line_ptr))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -5116,7 +5119,7 @@ _bfd_elf_validate_reloc (abfd, areloc)
|
|||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
arelent *areloc;
|
arelent *areloc;
|
||||||
{
|
{
|
||||||
/* Check whether we really have an ELF howto. */
|
/* Check whether we really have an ELF howto. */
|
||||||
|
|
||||||
if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
|
if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
|
||||||
{
|
{
|
||||||
@ -5124,7 +5127,7 @@ _bfd_elf_validate_reloc (abfd, areloc)
|
|||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
|
|
||||||
/* Alien reloc: Try to determine its type to replace it with an
|
/* Alien reloc: Try to determine its type to replace it with an
|
||||||
equivalent ELF reloc. */
|
equivalent ELF reloc. */
|
||||||
|
|
||||||
if (areloc->howto->pc_relative)
|
if (areloc->howto->pc_relative)
|
||||||
{
|
{
|
||||||
@ -5237,48 +5240,44 @@ _bfd_elf_rel_vtable_reloc_fn (abfd, re, symbol, data, is, obfd, errmsg)
|
|||||||
{
|
{
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Elf core file support. Much of this only works on native
|
/* Elf core file support. Much of this only works on native
|
||||||
toolchains, since we rely on knowing the
|
toolchains, since we rely on knowing the
|
||||||
machine-dependent procfs structure in order to pick
|
machine-dependent procfs structure in order to pick
|
||||||
out details about the corefile. */
|
out details about the corefile. */
|
||||||
|
|
||||||
#ifdef HAVE_SYS_PROCFS_H
|
#ifdef HAVE_SYS_PROCFS_H
|
||||||
# include <sys/procfs.h>
|
# include <sys/procfs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Define offsetof for those systems which lack it. */
|
||||||
/* Define offsetof for those systems which lack it. */
|
|
||||||
|
|
||||||
#ifndef offsetof
|
#ifndef offsetof
|
||||||
# define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
|
# define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* FIXME: this is kinda wrong, but it's what gdb wants. */
|
||||||
/* FIXME: this is kinda wrong, but it's what gdb wants. */
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
elfcore_make_pid (abfd)
|
elfcore_make_pid (abfd)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
return ((elf_tdata (abfd)->core_lwpid << 16)
|
return ((elf_tdata (abfd)->core_lwpid << 16)
|
||||||
+ (elf_tdata (abfd)->core_pid));
|
+ (elf_tdata (abfd)->core_pid));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* If there isn't a section called NAME, make one, using
|
/* If there isn't a section called NAME, make one, using
|
||||||
data from SECT. Note, this function will generate a
|
data from SECT. Note, this function will generate a
|
||||||
reference to NAME, so you shouldn't deallocate or
|
reference to NAME, so you shouldn't deallocate or
|
||||||
overwrite it. */
|
overwrite it. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_maybe_make_sect (abfd, name, sect)
|
elfcore_maybe_make_sect (abfd, name, sect)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
char* name;
|
char *name;
|
||||||
asection* sect;
|
asection *sect;
|
||||||
{
|
{
|
||||||
asection* sect2;
|
asection *sect2;
|
||||||
|
|
||||||
if (bfd_get_section_by_name (abfd, name) != NULL)
|
if (bfd_get_section_by_name (abfd, name) != NULL)
|
||||||
return true;
|
return true;
|
||||||
@ -5294,7 +5293,6 @@ elfcore_maybe_make_sect (abfd, name, sect)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* prstatus_t exists on:
|
/* prstatus_t exists on:
|
||||||
solaris 2.5+
|
solaris 2.5+
|
||||||
linux 2.[01] + glibc
|
linux 2.[01] + glibc
|
||||||
@ -5304,12 +5302,12 @@ elfcore_maybe_make_sect (abfd, name, sect)
|
|||||||
#if defined (HAVE_PRSTATUS_T)
|
#if defined (HAVE_PRSTATUS_T)
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_grok_prstatus (abfd, note)
|
elfcore_grok_prstatus (abfd, note)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Note* note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
char buf[100];
|
char buf[100];
|
||||||
char* name;
|
char *name;
|
||||||
asection* sect;
|
asection *sect;
|
||||||
int raw_size;
|
int raw_size;
|
||||||
int offset;
|
int offset;
|
||||||
|
|
||||||
@ -5365,7 +5363,7 @@ elfcore_grok_prstatus (abfd, note)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make a ".reg/999" section. */
|
/* Make a ".reg/999" section. */
|
||||||
|
|
||||||
sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
|
sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
|
||||||
name = bfd_alloc (abfd, strlen (buf) + 1);
|
name = bfd_alloc (abfd, strlen (buf) + 1);
|
||||||
@ -5390,7 +5388,6 @@ elfcore_grok_prstatus (abfd, note)
|
|||||||
}
|
}
|
||||||
#endif /* defined (HAVE_PRSTATUS_T) */
|
#endif /* defined (HAVE_PRSTATUS_T) */
|
||||||
|
|
||||||
|
|
||||||
/* Create a pseudosection containing the exact contents of NOTE. This
|
/* Create a pseudosection containing the exact contents of NOTE. This
|
||||||
actually creates up to two pseudosections:
|
actually creates up to two pseudosections:
|
||||||
- For the single-threaded case, a section named NAME, unless
|
- For the single-threaded case, a section named NAME, unless
|
||||||
@ -5401,13 +5398,13 @@ elfcore_grok_prstatus (abfd, note)
|
|||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_make_note_pseudosection (abfd, name, note)
|
elfcore_make_note_pseudosection (abfd, name, note)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
char *name;
|
char *name;
|
||||||
Elf_Internal_Note* note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
char buf[100];
|
char buf[100];
|
||||||
char *threaded_name;
|
char *threaded_name;
|
||||||
asection* sect;
|
asection *sect;
|
||||||
|
|
||||||
/* Build the section name. */
|
/* Build the section name. */
|
||||||
|
|
||||||
@ -5431,31 +5428,30 @@ elfcore_make_note_pseudosection (abfd, name, note)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* There isn't a consistent prfpregset_t across platforms,
|
/* There isn't a consistent prfpregset_t across platforms,
|
||||||
but it doesn't matter, because we don't have to pick this
|
but it doesn't matter, because we don't have to pick this
|
||||||
data structure apart. */
|
data structure apart. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_grok_prfpreg (abfd, note)
|
elfcore_grok_prfpreg (abfd, note)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Note* note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
return elfcore_make_note_pseudosection (abfd, ".reg2", note);
|
return elfcore_make_note_pseudosection (abfd, ".reg2", note);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
|
/* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
|
||||||
type of 5 (NT_PRXFPREG). Just include the whole note's contents
|
type of 5 (NT_PRXFPREG). Just include the whole note's contents
|
||||||
literally. */
|
literally. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_grok_prxfpreg (abfd, note)
|
elfcore_grok_prxfpreg (abfd, note)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Note* note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
|
return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined (HAVE_PRPSINFO_T)
|
#if defined (HAVE_PRPSINFO_T)
|
||||||
typedef prpsinfo_t elfcore_psinfo_t;
|
typedef prpsinfo_t elfcore_psinfo_t;
|
||||||
#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
|
#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
|
||||||
@ -5470,21 +5466,20 @@ typedef psinfo32_t elfcore_psinfo32_t;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
|
#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
|
||||||
|
|
||||||
/* return a malloc'ed copy of a string at START which is at
|
/* return a malloc'ed copy of a string at START which is at
|
||||||
most MAX bytes long, possibly without a terminating '\0'.
|
most MAX bytes long, possibly without a terminating '\0'.
|
||||||
the copy will always have a terminating '\0'. */
|
the copy will always have a terminating '\0'. */
|
||||||
|
|
||||||
static char*
|
static char*
|
||||||
elfcore_strndup (abfd, start, max)
|
elfcore_strndup (abfd, start, max)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
char* start;
|
char *start;
|
||||||
int max;
|
int max;
|
||||||
{
|
{
|
||||||
char* dup;
|
char *dup;
|
||||||
char* end = memchr (start, '\0', max);
|
char *end = memchr (start, '\0', max);
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (end == NULL)
|
if (end == NULL)
|
||||||
@ -5504,8 +5499,8 @@ elfcore_strndup (abfd, start, max)
|
|||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_grok_psinfo (abfd, note)
|
elfcore_grok_psinfo (abfd, note)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Note* note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
if (note->descsz == sizeof (elfcore_psinfo_t))
|
if (note->descsz == sizeof (elfcore_psinfo_t))
|
||||||
{
|
{
|
||||||
@ -5544,10 +5539,10 @@ elfcore_grok_psinfo (abfd, note)
|
|||||||
|
|
||||||
/* Note that for some reason, a spurious space is tacked
|
/* Note that for some reason, a spurious space is tacked
|
||||||
onto the end of the args in some (at least one anyway)
|
onto the end of the args in some (at least one anyway)
|
||||||
implementations, so strip it off if it exists. */
|
implementations, so strip it off if it exists. */
|
||||||
|
|
||||||
{
|
{
|
||||||
char* command = elf_tdata (abfd)->core_command;
|
char *command = elf_tdata (abfd)->core_command;
|
||||||
int n = strlen (command);
|
int n = strlen (command);
|
||||||
|
|
||||||
if (0 < n && command[n - 1] == ' ')
|
if (0 < n && command[n - 1] == ' ')
|
||||||
@ -5558,12 +5553,11 @@ elfcore_grok_psinfo (abfd, note)
|
|||||||
}
|
}
|
||||||
#endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
|
#endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
|
||||||
|
|
||||||
|
|
||||||
#if defined (HAVE_PSTATUS_T)
|
#if defined (HAVE_PSTATUS_T)
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_grok_pstatus (abfd, note)
|
elfcore_grok_pstatus (abfd, note)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Note* note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
if (note->descsz == sizeof (pstatus_t))
|
if (note->descsz == sizeof (pstatus_t))
|
||||||
{
|
{
|
||||||
@ -5586,23 +5580,22 @@ elfcore_grok_pstatus (abfd, note)
|
|||||||
#endif
|
#endif
|
||||||
/* Could grab some more details from the "representative"
|
/* Could grab some more details from the "representative"
|
||||||
lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
|
lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
|
||||||
NT_LWPSTATUS note, presumably. */
|
NT_LWPSTATUS note, presumably. */
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif /* defined (HAVE_PSTATUS_T) */
|
#endif /* defined (HAVE_PSTATUS_T) */
|
||||||
|
|
||||||
|
|
||||||
#if defined (HAVE_LWPSTATUS_T)
|
#if defined (HAVE_LWPSTATUS_T)
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_grok_lwpstatus (abfd, note)
|
elfcore_grok_lwpstatus (abfd, note)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Note* note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
lwpstatus_t lwpstat;
|
lwpstatus_t lwpstat;
|
||||||
char buf[100];
|
char buf[100];
|
||||||
char* name;
|
char *name;
|
||||||
asection* sect;
|
asection *sect;
|
||||||
|
|
||||||
if (note->descsz != sizeof (lwpstat))
|
if (note->descsz != sizeof (lwpstat))
|
||||||
return true;
|
return true;
|
||||||
@ -5612,7 +5605,7 @@ elfcore_grok_lwpstatus (abfd, note)
|
|||||||
elf_tdata (abfd)->core_lwpid = lwpstat.pr_lwpid;
|
elf_tdata (abfd)->core_lwpid = lwpstat.pr_lwpid;
|
||||||
elf_tdata (abfd)->core_signal = lwpstat.pr_cursig;
|
elf_tdata (abfd)->core_signal = lwpstat.pr_cursig;
|
||||||
|
|
||||||
/* Make a ".reg/999" section. */
|
/* Make a ".reg/999" section. */
|
||||||
|
|
||||||
sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
|
sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
|
||||||
name = bfd_alloc (abfd, strlen (buf) + 1);
|
name = bfd_alloc (abfd, strlen (buf) + 1);
|
||||||
@ -5677,41 +5670,41 @@ elfcore_grok_lwpstatus (abfd, note)
|
|||||||
#if defined (HAVE_WIN32_PSTATUS_T)
|
#if defined (HAVE_WIN32_PSTATUS_T)
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_grok_win32pstatus (abfd, note)
|
elfcore_grok_win32pstatus (abfd, note)
|
||||||
bfd * abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Note * note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
char buf[30];
|
char buf[30];
|
||||||
char * name;
|
char *name;
|
||||||
asection * sect;
|
asection *sect;
|
||||||
win32_pstatus_t pstatus;
|
win32_pstatus_t pstatus;
|
||||||
|
|
||||||
if (note->descsz < sizeof (pstatus))
|
if (note->descsz < sizeof (pstatus))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
memcpy (& pstatus, note->descdata, note->descsz);
|
memcpy (&pstatus, note->descdata, note->descsz);
|
||||||
|
|
||||||
switch (pstatus.data_type)
|
switch (pstatus.data_type)
|
||||||
{
|
{
|
||||||
case NOTE_INFO_PROCESS:
|
case NOTE_INFO_PROCESS:
|
||||||
/* FIXME: need to add ->core_command. */
|
/* FIXME: need to add ->core_command. */
|
||||||
elf_tdata (abfd)->core_signal = pstatus.data.process_info.signal;
|
elf_tdata (abfd)->core_signal = pstatus.data.process_info.signal;
|
||||||
elf_tdata (abfd)->core_pid = pstatus.data.process_info.pid;
|
elf_tdata (abfd)->core_pid = pstatus.data.process_info.pid;
|
||||||
break ;
|
break;
|
||||||
|
|
||||||
case NOTE_INFO_THREAD:
|
case NOTE_INFO_THREAD:
|
||||||
/* Make a ".reg/999" section. */
|
/* Make a ".reg/999" section. */
|
||||||
sprintf (buf, ".reg/%d", pstatus.data.thread_info.tid);
|
sprintf (buf, ".reg/%d", pstatus.data.thread_info.tid);
|
||||||
|
|
||||||
name = bfd_alloc (abfd, strlen (buf) + 1);
|
name = bfd_alloc (abfd, strlen (buf) + 1);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
strcpy (name, buf);
|
strcpy (name, buf);
|
||||||
|
|
||||||
sect = bfd_make_section (abfd, name);
|
sect = bfd_make_section (abfd, name);
|
||||||
if (sect == NULL)
|
if (sect == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
sect->_raw_size = sizeof (pstatus.data.thread_info.thread_context);
|
sect->_raw_size = sizeof (pstatus.data.thread_info.thread_context);
|
||||||
sect->filepos = note->descpos + offsetof (struct win32_pstatus,
|
sect->filepos = note->descpos + offsetof (struct win32_pstatus,
|
||||||
data.thread_info.thread_context);
|
data.thread_info.thread_context);
|
||||||
@ -5725,19 +5718,19 @@ elfcore_grok_win32pstatus (abfd, note)
|
|||||||
|
|
||||||
case NOTE_INFO_MODULE:
|
case NOTE_INFO_MODULE:
|
||||||
/* Make a ".module/xxxxxxxx" section. */
|
/* Make a ".module/xxxxxxxx" section. */
|
||||||
sprintf (buf, ".module/%08x" , pstatus.data.module_info.base_address);
|
sprintf (buf, ".module/%08x", pstatus.data.module_info.base_address);
|
||||||
|
|
||||||
name = bfd_alloc (abfd, strlen (buf) + 1);
|
name = bfd_alloc (abfd, strlen (buf) + 1);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
strcpy (name, buf);
|
strcpy (name, buf);
|
||||||
|
|
||||||
sect = bfd_make_section (abfd, name);
|
sect = bfd_make_section (abfd, name);
|
||||||
|
|
||||||
if (sect == NULL)
|
if (sect == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
sect->_raw_size = note->descsz;
|
sect->_raw_size = note->descsz;
|
||||||
sect->filepos = note->descpos;
|
sect->filepos = note->descpos;
|
||||||
sect->flags = SEC_HAS_CONTENTS;
|
sect->flags = SEC_HAS_CONTENTS;
|
||||||
@ -5754,8 +5747,8 @@ elfcore_grok_win32pstatus (abfd, note)
|
|||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_grok_note (abfd, note)
|
elfcore_grok_note (abfd, note)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Note* note;
|
Elf_Internal_Note *note;
|
||||||
{
|
{
|
||||||
switch (note->type)
|
switch (note->type)
|
||||||
{
|
{
|
||||||
@ -5781,11 +5774,11 @@ elfcore_grok_note (abfd, note)
|
|||||||
return elfcore_grok_prfpreg (abfd, note);
|
return elfcore_grok_prfpreg (abfd, note);
|
||||||
|
|
||||||
#if defined (HAVE_WIN32_PSTATUS_T)
|
#if defined (HAVE_WIN32_PSTATUS_T)
|
||||||
case NT_WIN32PSTATUS:
|
case NT_WIN32PSTATUS:
|
||||||
return elfcore_grok_win32pstatus (abfd, note);
|
return elfcore_grok_win32pstatus (abfd, note);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case NT_PRXFPREG: /* Linux SSE extension */
|
case NT_PRXFPREG: /* Linux SSE extension */
|
||||||
if (note->namesz == 5
|
if (note->namesz == 5
|
||||||
&& ! strcmp (note->namedata, "LINUX"))
|
&& ! strcmp (note->namedata, "LINUX"))
|
||||||
return elfcore_grok_prxfpreg (abfd, note);
|
return elfcore_grok_prxfpreg (abfd, note);
|
||||||
@ -5800,15 +5793,14 @@ elfcore_grok_note (abfd, note)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
elfcore_read_notes (abfd, offset, size)
|
elfcore_read_notes (abfd, offset, size)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
bfd_vma offset;
|
bfd_vma offset;
|
||||||
bfd_vma size;
|
bfd_vma size;
|
||||||
{
|
{
|
||||||
char* buf;
|
char *buf;
|
||||||
char* p;
|
char *p;
|
||||||
|
|
||||||
if (size <= 0)
|
if (size <= 0)
|
||||||
return true;
|
return true;
|
||||||
@ -5830,8 +5822,8 @@ elfcore_read_notes (abfd, offset, size)
|
|||||||
p = buf;
|
p = buf;
|
||||||
while (p < buf + size)
|
while (p < buf + size)
|
||||||
{
|
{
|
||||||
/* FIXME: bad alignment assumption. */
|
/* FIXME: bad alignment assumption. */
|
||||||
Elf_External_Note* xnp = (Elf_External_Note*) p;
|
Elf_External_Note *xnp = (Elf_External_Note *) p;
|
||||||
Elf_Internal_Note in;
|
Elf_Internal_Note in;
|
||||||
|
|
||||||
in.type = bfd_h_get_32 (abfd, (bfd_byte *) xnp->type);
|
in.type = bfd_h_get_32 (abfd, (bfd_byte *) xnp->type);
|
||||||
@ -5853,13 +5845,12 @@ elfcore_read_notes (abfd, offset, size)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: This function is now unnecessary. Callers can just call
|
/* FIXME: This function is now unnecessary. Callers can just call
|
||||||
bfd_section_from_phdr directly. */
|
bfd_section_from_phdr directly. */
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
_bfd_elfcore_section_from_phdr (abfd, phdr, sec_num)
|
_bfd_elfcore_section_from_phdr (abfd, phdr, sec_num)
|
||||||
bfd* abfd;
|
bfd *abfd;
|
||||||
Elf_Internal_Phdr* phdr;
|
Elf_Internal_Phdr* phdr;
|
||||||
int sec_num;
|
int sec_num;
|
||||||
{
|
{
|
||||||
@ -5868,14 +5859,13 @@ _bfd_elfcore_section_from_phdr (abfd, phdr, sec_num)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Providing external access to the ELF program header table. */
|
/* Providing external access to the ELF program header table. */
|
||||||
|
|
||||||
/* Return an upper bound on the number of bytes required to store a
|
/* Return an upper bound on the number of bytes required to store a
|
||||||
copy of ABFD's program header table entries. Return -1 if an error
|
copy of ABFD's program header table entries. Return -1 if an error
|
||||||
occurs; bfd_get_error will return an appropriate code. */
|
occurs; bfd_get_error will return an appropriate code. */
|
||||||
|
|
||||||
long
|
long
|
||||||
bfd_get_elf_phdr_upper_bound (abfd)
|
bfd_get_elf_phdr_upper_bound (abfd)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
@ -5890,7 +5880,6 @@ bfd_get_elf_phdr_upper_bound (abfd)
|
|||||||
* sizeof (Elf_Internal_Phdr));
|
* sizeof (Elf_Internal_Phdr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Copy ABFD's program header table entries to *PHDRS. The entries
|
/* Copy ABFD's program header table entries to *PHDRS. The entries
|
||||||
will be stored as an array of Elf_Internal_Phdr structures, as
|
will be stored as an array of Elf_Internal_Phdr structures, as
|
||||||
defined in include/elf/internal.h. To find out how large the
|
defined in include/elf/internal.h. To find out how large the
|
||||||
@ -5898,6 +5887,7 @@ bfd_get_elf_phdr_upper_bound (abfd)
|
|||||||
|
|
||||||
Return the number of program header table entries read, or -1 if an
|
Return the number of program header table entries read, or -1 if an
|
||||||
error occurs; bfd_get_error will return an appropriate code. */
|
error occurs; bfd_get_error will return an appropriate code. */
|
||||||
|
|
||||||
int
|
int
|
||||||
bfd_get_elf_phdrs (abfd, phdrs)
|
bfd_get_elf_phdrs (abfd, phdrs)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
@ -5912,7 +5902,7 @@ bfd_get_elf_phdrs (abfd, phdrs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
num_phdrs = elf_elfheader (abfd)->e_phnum;
|
num_phdrs = elf_elfheader (abfd)->e_phnum;
|
||||||
memcpy (phdrs, elf_tdata (abfd)->phdr,
|
memcpy (phdrs, elf_tdata (abfd)->phdr,
|
||||||
num_phdrs * sizeof (Elf_Internal_Phdr));
|
num_phdrs * sizeof (Elf_Internal_Phdr));
|
||||||
|
|
||||||
return num_phdrs;
|
return num_phdrs;
|
||||||
|
Reference in New Issue
Block a user