* elf32-hppa.c (hppa_unwind_entry_compare): Move to elf-hppa.h.

(elf32_hppa_final_link): Split out sorting logic to..
	* elf-hppa.h (elf_hppa_sort_unwind): ..here.
	(elf_hppa_final_link): Call elf_hppa_sort_unwind.
This commit is contained in:
Alan Modra 2002-04-08 11:01:43 +00:00
parent f18dabd22e
commit 46fe4e66d4
3 changed files with 88 additions and 65 deletions

View File

@ -1,3 +1,10 @@
2002-04-08 Randolph Chung <tausq@debian.org>
* elf32-hppa.c (hppa_unwind_entry_compare): Move to elf-hppa.h.
(elf32_hppa_final_link): Split out sorting logic to..
* elf-hppa.h (elf_hppa_sort_unwind): ..here.
(elf_hppa_final_link): Call elf_hppa_sort_unwind.
2002-04-07 Andrew Cagney <ac131313@redhat.com>
* configure.in: Add missing ``|'' to powerpc-*-aix4.[4-9]*

View File

@ -64,6 +64,12 @@ static boolean elf_hppa_fake_sections
static void elf_hppa_final_write_processing
PARAMS ((bfd *, boolean));
static int hppa_unwind_entry_compare
PARAMS ((const PTR, const PTR));
static boolean elf_hppa_sort_unwind
PARAMS ((bfd *));
#if ARCH_SIZE == 64
static boolean elf_hppa_add_symbol_hook
PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
@ -1037,6 +1043,64 @@ elf_hppa_final_write_processing (abfd, linker)
| EF_PARISC_TRAPNIL);
}
/* Comparison function for qsort to sort unwind section during a
final link. */
static int
hppa_unwind_entry_compare (a, b)
const PTR a;
const PTR b;
{
const bfd_byte *ap, *bp;
unsigned long av, bv;
ap = (const bfd_byte *) a;
av = (unsigned long) ap[0] << 24;
av |= (unsigned long) ap[1] << 16;
av |= (unsigned long) ap[2] << 8;
av |= (unsigned long) ap[3];
bp = (const bfd_byte *) b;
bv = (unsigned long) bp[0] << 24;
bv |= (unsigned long) bp[1] << 16;
bv |= (unsigned long) bp[2] << 8;
bv |= (unsigned long) bp[3];
return av < bv ? -1 : av > bv ? 1 : 0;
}
static boolean elf_hppa_sort_unwind (abfd)
bfd *abfd;
{
asection *s;
/* Magic section names, but this is much safer than having
relocate_section remember where SEGREL32 relocs occurred.
Consider what happens if someone inept creates a linker script
that puts unwind information in .text. */
s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
if (s != NULL)
{
bfd_size_type size;
char *contents;
size = s->_raw_size;
contents = bfd_malloc (size);
if (contents == NULL)
return false;
if (! bfd_get_section_contents (abfd, s, contents, (file_ptr) 0, size))
return false;
qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
return false;
}
return true;
}
#if ARCH_SIZE == 64
/* Hook called by the linker routine which adds symbols from an object
file. HP's libraries define symbols with HP specific section
@ -1284,6 +1348,11 @@ elf_hppa_final_link (abfd, info)
elf_hppa_remark_useless_dynamic_symbols,
info);
/* If we're producing a final executable, sort the contents of the
unwind section. */
if (retval)
retval = elf_hppa_sort_unwind (abfd);
return retval;
}

View File

@ -376,9 +376,6 @@ static boolean elf32_hppa_relocate_section
PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
static int hppa_unwind_entry_compare
PARAMS ((const PTR, const PTR));
static boolean elf32_hppa_finish_dynamic_symbol
PARAMS ((bfd *, struct bfd_link_info *,
struct elf_link_hash_entry *, Elf_Internal_Sym *));
@ -3283,37 +3280,13 @@ elf32_hppa_final_link (abfd, info)
bfd *abfd;
struct bfd_link_info *info;
{
asection *s;
/* Invoke the regular ELF linker to do all the work. */
if (!bfd_elf32_bfd_final_link (abfd, info))
return false;
/* If we're producing a final executable, sort the contents of the
unwind section. Magic section names, but this is much safer than
having elf32_hppa_relocate_section remember where SEGREL32 relocs
occurred. Consider what happens if someone inept creates a
linker script that puts unwind information in .text. */
s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
if (s != NULL)
{
bfd_size_type size;
char *contents;
size = s->_raw_size;
contents = bfd_malloc (size);
if (contents == NULL)
return false;
if (! bfd_get_section_contents (abfd, s, contents, (file_ptr) 0, size))
return false;
qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
return false;
}
return true;
unwind section. */
return elf_hppa_sort_unwind (abfd);
}
/* Record the lowest address for the data and text segments. */
@ -4124,32 +4097,6 @@ elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
return true;
}
/* Comparison function for qsort to sort unwind section during a
final link. */
static int
hppa_unwind_entry_compare (a, b)
const PTR a;
const PTR b;
{
const bfd_byte *ap, *bp;
unsigned long av, bv;
ap = (const bfd_byte *) a;
av = (unsigned long) ap[0] << 24;
av |= (unsigned long) ap[1] << 16;
av |= (unsigned long) ap[2] << 8;
av |= (unsigned long) ap[3];
bp = (const bfd_byte *) b;
bv = (unsigned long) bp[0] << 24;
bv |= (unsigned long) bp[1] << 16;
bv |= (unsigned long) bp[2] << 8;
bv |= (unsigned long) bp[3];
return av < bv ? -1 : av > bv ? 1 : 0;
}
/* Finish up dynamic symbol handling. We set the contents of various
dynamic sections here. */