* elf-bfd.h: Add prototypes for _bfd_elfcore_make_pseudosection

and _bfd_elfcore_strndup.
	(struct elf_backend_data): Add elf_backend_grok_prstatus
	and elf_backend_grok_psinfo.
	* elf.c (_bfd_elfcore_make_pseudosection): New function.
	(elfcore_grok_prstatus): Use it.
	(elfcore_make_note_pseudosection): Likewise.
	(elfcore_strndup):  Rename to...
	(_bfd_elfcore_strndup): Here, and make global.
	(elfcore_grok_psinfo): Use _bfd_elfcore_strndup.
	(elfcore_grok_note): Call elf_backend_grok_prstatus
	and elf_backend_grok_psinfo if available.
	* elf32-mips.c (_bfd_elf32_mips_grok_prstatus): New function.
	(_bfd_elf32_mips_grok_psinfo): New function.
	(elf_backend_grok_prstatus): Define.
	(elf_backend_grok_psinfo): Define.
	* elfxx-target.h (elf_backend_grok_prstatus): Default to NULL.
	(elf_backend_grok_psinfo): Likewise.
	(elfNN_bed): Include elf_backend_grok_prstatus and
	elf_backend_grok_psinfo.
This commit is contained in:
Alan Modra 2001-06-30 03:15:46 +00:00
parent b64977c5ff
commit bb0082d686
5 changed files with 243 additions and 129 deletions

View File

@ -1,3 +1,26 @@
2001-06-29 Daniel Jacobowitz <drow@mvista.com>
* elf-bfd.h: Add prototypes for _bfd_elfcore_make_pseudosection
and _bfd_elfcore_strndup.
(struct elf_backend_data): Add elf_backend_grok_prstatus
and elf_backend_grok_psinfo.
* elf.c (_bfd_elfcore_make_pseudosection): New function.
(elfcore_grok_prstatus): Use it.
(elfcore_make_note_pseudosection): Likewise.
(elfcore_strndup): Rename to...
(_bfd_elfcore_strndup): Here, and make global.
(elfcore_grok_psinfo): Use _bfd_elfcore_strndup.
(elfcore_grok_note): Call elf_backend_grok_prstatus
and elf_backend_grok_psinfo if available.
* elf32-mips.c (_bfd_elf32_mips_grok_prstatus): New function.
(_bfd_elf32_mips_grok_psinfo): New function.
(elf_backend_grok_prstatus): Define.
(elf_backend_grok_psinfo): Define.
* elfxx-target.h (elf_backend_grok_prstatus): Default to NULL.
(elf_backend_grok_psinfo): Likewise.
(elfNN_bed): Include elf_backend_grok_prstatus and
elf_backend_grok_psinfo.
2001-06-29 H.J. Lu <hjl@gnu.org>
* elf32-hppa.c (elf32_hppa_finish_dynamic_sections): Check if
@ -132,30 +155,30 @@
2001-06-20 Catherine Moore <clm@redhat.com>
* elf-bfd.h (struct elf_backend_data):
elf_backend_emit_relocs: New field: Function for emitting
relocs.
elf_backend_count_relocs: New field: Function for determining
the number of relocs to be emitted.
* elfxx-target.h: Provide default (NULL) values for
elf_backend_emit_relocs and elf_backend_count_relocs.
* elflink.h (elf_link_size_reloc_section): Make the hash table
big enough to hold the relocs counted by either reloc_count or
o->reloc_count.
(elf_bfd_final_link) emit_relocs: New boolean, set if relocs
should be emitted, either because of a command line option
stored in the info structure or because the target provides a
special reloc emitting function.
If the target provides a reloc counting function use it,
unless performing a relocatable link or emitting all relocs.
Also set the SEC_RELOC flag on any output section which will
contain relocs.
(elf_link_input_bfd): emit_relocs: New boolean, set if relocs
should be emitted, either because of a command line option
stored in the info structure or because the target provides a
special reloc emitting function.
If the target provides a reloc emitting function, use it,
unless performing a relocatable link or emitting all relocs.
* elf-bfd.h (struct elf_backend_data):
elf_backend_emit_relocs: New field: Function for emitting
relocs.
elf_backend_count_relocs: New field: Function for determining
the number of relocs to be emitted.
* elfxx-target.h: Provide default (NULL) values for
elf_backend_emit_relocs and elf_backend_count_relocs.
* elflink.h (elf_link_size_reloc_section): Make the hash table
big enough to hold the relocs counted by either reloc_count or
o->reloc_count.
(elf_bfd_final_link) emit_relocs: New boolean, set if relocs
should be emitted, either because of a command line option
stored in the info structure or because the target provides a
special reloc emitting function.
If the target provides a reloc counting function use it,
unless performing a relocatable link or emitting all relocs.
Also set the SEC_RELOC flag on any output section which will
contain relocs.
(elf_link_input_bfd): emit_relocs: New boolean, set if relocs
should be emitted, either because of a command line option
stored in the info structure or because the target provides a
special reloc emitting function.
If the target provides a reloc emitting function, use it,
unless performing a relocatable link or emitting all relocs.
2001-06-20 H.J. Lu <hjl@gnu.org>
@ -209,13 +232,13 @@
function. Move flagword result into parameter list. Remove
comment about setting bfd_error_handler to intercept failure
results.
* coffgen.c (make_a_section_from_file): Examine result of
* coffgen.c (make_a_section_from_file): Examine result of
calling bfd_coff_styp_to_sec_flags and pass a failure back to
caller.
* ecoff.h (styp_flags_to_sec_flags): Change to a boolean
* ecoff.h (styp_flags_to_sec_flags): Change to a boolean
function. Move flagword result into parameter list.
* libcoff.h: Regenerate.
* libecoff.h: Regenerate.
* libcoff.h: Regenerate.
* libecoff.h: Regenerate.
2001-06-13 Nick Clifton <nickc@cambridge.redhat.com>
@ -224,10 +247,10 @@
2001-06-12 Catherine Moore <clm@redhat.com>
* elflink.h (elf_gc_propagate_vtable_entries): Replace FILE_ALIGN
with the file_align entry from elf_backend_data.
(elf_gc_smash_unused_vtentry_relocs): Likewise.
(elf_gc_record_vtentry): Likewise.
* elflink.h (elf_gc_propagate_vtable_entries): Replace FILE_ALIGN
with the file_align entry from elf_backend_data.
(elf_gc_smash_unused_vtentry_relocs): Likewise.
(elf_gc_record_vtentry): Likewise.
2001-06-10 Alan Modra <amodra@bigpond.net.au>
@ -275,7 +298,7 @@
2001-06-06 Christian Groessler <cpg@aladdin.de>
* coff-z8k.c: Fix formatting.
* coff-z8k.c: Fix formatting.
Fix howtos: howto->size was always 1.
2001-06-05 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
@ -468,7 +491,7 @@
2001-05-24 Tom Rix <trix@redhat.com>
* Makefile.am coff-pmac bfd now defined in coff-rs6000.c
* Makefile.am coff-pmac bfd now defined in coff-rs6000.c
xcoff-target.h not used to define rs6000 or ppc bfd.
* Makefile.in same
@ -546,13 +569,13 @@
* elf-bfd.h (NUM_SHDR_ENTRIES): New macro: compute the number
of entries in a structured section.
* elf.c: Use new macro.
* elf32-i386.c: Use new macro.
* elf32-mips.c: Use new macro.
* elf64-alpha.c: Use new macro.
* elf64-sparc.c: Use new macro.
* elfcode.h: Use new macro.
* elflink.h: Use new macro.
* elf.c: Use new macro.
* elf32-i386.c: Use new macro.
* elf32-mips.c: Use new macro.
* elf64-alpha.c: Use new macro.
* elf64-sparc.c: Use new macro.
* elfcode.h: Use new macro.
* elflink.h: Use new macro.
2001-05-23 Nick Clifton <nickc@cambridge.redhat.com>
@ -709,7 +732,7 @@
2001-05-04 Nick Clifton <nickc@cambridge.redhat.com>
* elf32-arm.h (elf32_arm_final_link_relocate): Set
EF_ARM_HASENTRY if the start address is set.
EF_ARM_HASENTRY if the start address is set.
2001-05-03 Nick Clifton <nickc@cambridge.redhat.com>
@ -750,7 +773,7 @@
2001-05-02 Johan Rydberg <jrydberg@opencores.org>
* elf32-openrisc.c (openrisc_elf_howto_table): Do not complain
* elf32-openrisc.c (openrisc_elf_howto_table): Do not complain
about overflow in R_OPENRISC_LO_16_IN_INSN and
R_OPENRISC_HI_16_IN_INSN.Index: bfd/elf32-openrisc.c
@ -992,31 +1015,31 @@
2001-03-23 Nick Clifton <nickc@redhat.com>
* Makefile.am (BUILD_CFILES): New variable: List of C source
files created in build directory.
(BUILD_HFILES): New variable: List of header files created in
build directory.
(POTFILES): Delete.
(po/POTFILES.in): Replace rule with empty entry.
(po/SRC-POTFILES.in): New rule: Create a list of source files
in the source directory.
(po/BLD-POTFILES.in): New rule: Create a list of source files
in the build directory.
(MOSTLYCLEAN): Do not delete source files created in build
directory.
* Makefile.in: Regenerate.
* configure.in: Insert SRC-POTFILES.in and BLD-POTFILES.in
into po/Makefile.
* configure: Regenerate.
files created in build directory.
(BUILD_HFILES): New variable: List of header files created in
build directory.
(POTFILES): Delete.
(po/POTFILES.in): Replace rule with empty entry.
(po/SRC-POTFILES.in): New rule: Create a list of source files
in the source directory.
(po/BLD-POTFILES.in): New rule: Create a list of source files
in the build directory.
(MOSTLYCLEAN): Do not delete source files created in build
directory.
* Makefile.in: Regenerate.
* configure.in: Insert SRC-POTFILES.in and BLD-POTFILES.in
into po/Makefile.
* configure: Regenerate.
* po/Make-in: Replace occurrences of POTFILES with SRC-POTFILES
and BLD_POTFILES.
* po/Make-in: Replace occurrences of POTFILES with SRC-POTFILES
and BLD_POTFILES.
Add .. to the search path when building bfd.pot.
Delete POTFILES when performing distclean.
Add comment describing why distclean is broken in maintainer mode.
Delete POTFILES when performing distclean.
Add comment describing why distclean is broken in maintainer mode.
* po/POTFILES.in: Delete.
* po/SRC-POTFILES.in: New file.
* po/BLD-POTFILES.in: New file.
* po/bfd.pot: Regenerate.
* po/bfd.pot: Regenerate.
2001-03-22 Hans-Peter Nilsson <hp@axis.com>
@ -1149,7 +1172,7 @@
of offset in BLX(1) instruction.
* coff-arm.c (coff_arm_relocate_section): Clear bit zero of
offset in BLX(1) instruction.
Fix formatting.
Fix formatting.
2001-03-06 Nick Clifton <nickc@redhat.com>
@ -1207,7 +1230,7 @@
* coffcode.h (styp_to_sec_flags) [COFF_WITH_PE version]: Tidy
up, replacing multiple if statements with a switch.
(handle_COMDAT): New function.
(handle_COMDAT): New function.
2001-02-26 H.J. Lu <hjl@gnu.org>

View File

@ -628,6 +628,14 @@ struct elf_backend_data
unsigned int (*elf_backend_count_relocs)
PARAMS ((asection *, Elf_Internal_Rela *));
/* This function, if defined, is called when an NT_PRSTATUS note is found
in a core file. */
boolean (*elf_backend_grok_prstatus) PARAMS ((bfd *, Elf_Internal_Note *));
/* This function, if defined, is called when an NT_PSINFO or NT_PRPSINFO
note is found in a core file. */
boolean (*elf_backend_grok_psinfo) PARAMS ((bfd *, Elf_Internal_Note *));
/* The swapping table to use when dealing with ECOFF information.
Used for the MIPS ELF .mdebug section. */
const struct ecoff_debug_swap *elf_backend_ecoff_debug_swap;
@ -1098,6 +1106,9 @@ boolean _bfd_elf_create_got_section PARAMS ((bfd *,
unsigned long _bfd_elf_link_renumber_dynsyms PARAMS ((bfd *,
struct bfd_link_info *));
boolean _bfd_elfcore_make_pseudosection PARAMS ((bfd *, char *, int, int));
char *_bfd_elfcore_strndup PARAMS ((bfd *, char *, int));
elf_linker_section_t *_bfd_elf_create_linker_section
PARAMS ((bfd *abfd,
struct bfd_link_info *info,

131
bfd/elf.c
View File

@ -5376,6 +5376,46 @@ elfcore_maybe_make_sect (abfd, name, sect)
return true;
}
/* Create a pseudosection containing SIZE bytes at FILEPOS. This
actually creates up to two pseudosections:
- For the single-threaded case, a section named NAME, unless
such a section already exists.
- For the multi-threaded case, a section named "NAME/PID", where
PID is elfcore_make_pid (abfd).
Both pseudosections have identical contents. */
boolean
_bfd_elfcore_make_pseudosection (abfd, name, size, filepos)
bfd *abfd;
char *name;
int size;
int filepos;
{
char buf[100];
char *threaded_name;
asection *sect;
/* Build the section name. */
sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
threaded_name = bfd_alloc (abfd, strlen (buf) + 1);
if (threaded_name == NULL)
return false;
strcpy (threaded_name, buf);
sect = bfd_make_section (abfd, threaded_name);
if (sect == NULL)
return false;
sect->_raw_size = size;
sect->filepos = filepos;
sect->flags = SEC_HAS_CONTENTS;
sect->alignment_power = 2;
if (! elfcore_maybe_make_sect (abfd, name, sect))
return false;
return true;
}
/* prstatus_t exists on:
solaris 2.5+
linux 2.[01] + glibc
@ -5388,9 +5428,6 @@ elfcore_grok_prstatus (abfd, note)
bfd *abfd;
Elf_Internal_Note *note;
{
char buf[100];
char *name;
asection *sect;
int raw_size;
int offset;
@ -5446,69 +5483,23 @@ elfcore_grok_prstatus (abfd, note)
return true;
}
/* Make a ".reg/999" section. */
sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
name = bfd_alloc (abfd, strlen (buf) + 1);
if (name == NULL)
return false;
strcpy (name, buf);
sect = bfd_make_section (abfd, name);
if (sect == NULL)
return false;
sect->_raw_size = raw_size;
sect->filepos = note->descpos + offset;
sect->flags = SEC_HAS_CONTENTS;
sect->alignment_power = 2;
if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
/* Make a ".reg/999" section and a ".reg" section. */
if (! _bfd_elfcore_make_pseudosection (abfd, ".reg",
raw_size, note->descpos + offset));
return false;
return true;
}
#endif /* defined (HAVE_PRSTATUS_T) */
/* Create a pseudosection containing the exact contents of NOTE. This
actually creates up to two pseudosections:
- For the single-threaded case, a section named NAME, unless
such a section already exists.
- For the multi-threaded case, a section named "NAME/PID", where
PID is elfcore_make_pid (abfd).
Both pseudosections have identical contents: the contents of NOTE. */
/* Create a pseudosection containing the exact contents of NOTE. */
static boolean
elfcore_make_note_pseudosection (abfd, name, note)
bfd *abfd;
char *name;
Elf_Internal_Note *note;
{
char buf[100];
char *threaded_name;
asection *sect;
/* Build the section name. */
sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
threaded_name = bfd_alloc (abfd, strlen (buf) + 1);
if (threaded_name == NULL)
return false;
strcpy (threaded_name, buf);
sect = bfd_make_section (abfd, threaded_name);
if (sect == NULL)
return false;
sect->_raw_size = note->descsz;
sect->filepos = note->descpos;
sect->flags = SEC_HAS_CONTENTS;
sect->alignment_power = 2;
if (! elfcore_maybe_make_sect (abfd, name, sect))
return false;
return true;
return _bfd_elfcore_make_pseudosection (abfd, name, note->descsz, note->descpos);
}
/* There isn't a consistent prfpregset_t across platforms,
@ -5549,14 +5540,12 @@ typedef psinfo32_t elfcore_psinfo32_t;
#endif
#endif
#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
/* return a malloc'ed copy of a string at START which is at
most MAX bytes long, possibly without a terminating '\0'.
the copy will always have a terminating '\0'. */
static char*
elfcore_strndup (abfd, start, max)
char*
_bfd_elfcore_strndup (abfd, start, max)
bfd *abfd;
char *start;
int max;
@ -5580,6 +5569,8 @@ elfcore_strndup (abfd, start, max)
return dup;
}
#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
static boolean
elfcore_grok_psinfo (abfd, note)
bfd *abfd;
@ -5592,10 +5583,10 @@ elfcore_grok_psinfo (abfd, note)
memcpy (&psinfo, note->descdata, sizeof (psinfo));
elf_tdata (abfd)->core_program
= elfcore_strndup (abfd, psinfo.pr_fname, sizeof (psinfo.pr_fname));
= _bfd_elfcore_strndup (abfd, psinfo.pr_fname, sizeof (psinfo.pr_fname));
elf_tdata (abfd)->core_command
= elfcore_strndup (abfd, psinfo.pr_psargs, sizeof (psinfo.pr_psargs));
= _bfd_elfcore_strndup (abfd, psinfo.pr_psargs, sizeof (psinfo.pr_psargs));
}
#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
else if (note->descsz == sizeof (elfcore_psinfo32_t))
@ -5606,10 +5597,10 @@ elfcore_grok_psinfo (abfd, note)
memcpy (&psinfo, note->descdata, sizeof (psinfo));
elf_tdata (abfd)->core_program
= elfcore_strndup (abfd, psinfo.pr_fname, sizeof (psinfo.pr_fname));
= _bfd_elfcore_strndup (abfd, psinfo.pr_fname, sizeof (psinfo.pr_fname));
elf_tdata (abfd)->core_command
= elfcore_strndup (abfd, psinfo.pr_psargs, sizeof (psinfo.pr_psargs));
= _bfd_elfcore_strndup (abfd, psinfo.pr_psargs, sizeof (psinfo.pr_psargs));
}
#endif
@ -5841,14 +5832,21 @@ elfcore_grok_note (abfd, note)
bfd *abfd;
Elf_Internal_Note *note;
{
struct elf_backend_data *bed = get_elf_backend_data (abfd);
switch (note->type)
{
default:
return true;
#if defined (HAVE_PRSTATUS_T)
case NT_PRSTATUS:
if (bed->elf_backend_grok_prstatus)
if ((*bed->elf_backend_grok_prstatus) (abfd, note))
return true;
#if defined (HAVE_PRSTATUS_T)
return elfcore_grok_prstatus (abfd, note);
#else
return true;
#endif
#if defined (HAVE_PSTATUS_T)
@ -5876,10 +5874,15 @@ elfcore_grok_note (abfd, note)
else
return true;
#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
case NT_PRPSINFO:
case NT_PSINFO:
if (bed->elf_backend_grok_psinfo)
if ((*bed->elf_backend_grok_psinfo) (abfd, note))
return true;
#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
return elfcore_grok_psinfo (abfd, note);
#else
return true;
#endif
}
}

View File

@ -9134,6 +9134,73 @@ _bfd_mips_elf_finish_dynamic_sections (output_bfd, info)
return true;
}
/* Support for core dump NOTE sections */
static boolean
_bfd_elf32_mips_grok_prstatus (abfd, note)
bfd *abfd;
Elf_Internal_Note *note;
{
int offset;
int raw_size;
switch (note->descsz)
{
default:
return false;
case 256: /* Linux/MIPS */
/* pr_cursig */
elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
/* pr_pid */
elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
/* pr_reg */
offset = 72;
raw_size = 180;
break;
}
/* Make a ".reg/999" section. */
if (! _bfd_elfcore_make_pseudosection (abfd, ".reg",
raw_size, note->descpos + offset))
return false;
return true;
}
static boolean _bfd_elf32_mips_grok_psinfo (abfd, note)
bfd *abfd;
Elf_Internal_Note *note;
{
switch (note->descsz)
{
default:
return false;
case 128: /* Linux/MIPS elf_prpsinfo */
elf_tdata (abfd)->core_program
= _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
elf_tdata (abfd)->core_command
= _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
}
/* Note that for some reason, a spurious space is tacked
onto the end of the args in some (at least one anyway)
implementations, so strip it off if it exists. */
{
char *command = elf_tdata (abfd)->core_command;
int n = strlen (command);
if (0 < n && command[n - 1] == ' ')
command[n - 1] = '\0';
}
return true;
}
/* This is almost identical to bfd_generic_get_... except that some
MIPS relocations need to be handled specially. Sigh. */
@ -9421,6 +9488,8 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
_bfd_mips_elf_copy_indirect_symbol
#define elf_backend_hide_symbol _bfd_mips_elf_hide_symbol
#define elf_backend_grok_prstatus _bfd_elf32_mips_grok_prstatus
#define elf_backend_grok_psinfo _bfd_elf32_mips_grok_psinfo
#define bfd_elf32_bfd_is_local_label_name \
mips_elf_is_local_label_name

View File

@ -329,6 +329,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef elf_backend_count_relocs
#define elf_backend_count_relocs NULL
#endif
#ifndef elf_backend_grok_prstatus
#define elf_backend_grok_prstatus NULL
#endif
#ifndef elf_backend_grok_psinfo
#define elf_backend_grok_psinfo NULL
#endif
/* Previously, backends could only use SHT_REL or SHT_RELA relocation
sections, but not both. They defined USE_REL to indicate SHT_REL
@ -412,6 +418,8 @@ static CONST struct elf_backend_data elfNN_bed =
elf_backend_hide_symbol,
elf_backend_emit_relocs,
elf_backend_count_relocs,
elf_backend_grok_prstatus,
elf_backend_grok_psinfo,
elf_backend_ecoff_debug_swap,
ELF_MACHINE_ALT1,
ELF_MACHINE_ALT2,