diff options
-rw-r--r-- | bfd/ChangeLog | 12 | ||||
-rw-r--r-- | bfd/elf32-mips.c | 104 | ||||
-rw-r--r-- | bfd/elf64-mips.c | 4 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 97 | ||||
-rw-r--r-- | bfd/elfxx-mips.h | 4 |
5 files changed, 118 insertions, 103 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index db137f9..3a219e1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2002-07-19 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> + + * elfxx-mips.c (_bfd_mips_elf_discard_info): New function, code from + elf32-mips.c. + (_bfd_mips_elf_write_section): Likewise. + * elfxx-mips.h (_bfd_mips_elf_discard_info): New prototype. + (_bfd_mips_elf_write_section): Likewise. + * elf32-mips.c (elf32_mips_discard_info): Move to elfxx-mips.c. + (elf32_mips_write_section): Likewise. + * elf64-mips.c (_bfd_mips_elf_ignore_discarded_relocs): Use it. + (_bfd_mips_elf_write_section): Likewise. + 2002-07-19 Alan Modra <amodra@bigpond.net.au> * elfxx-ia64.c: (elfNN_ia64_modify_segment_map): Properly scan diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 4672f12..c8b31a9 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -80,10 +80,6 @@ static boolean elf32_mips_grok_prstatus PARAMS ((bfd *, Elf_Internal_Note *)); static boolean elf32_mips_grok_psinfo PARAMS ((bfd *, Elf_Internal_Note *)); -static boolean elf32_mips_discard_info - PARAMS ((bfd *, struct elf_reloc_cookie *, struct bfd_link_info *)); -static boolean elf32_mips_write_section - PARAMS ((bfd *, asection *, bfd_byte *)); static irix_compat_t elf32_mips_irix_compat PARAMS ((bfd *)); @@ -1660,103 +1656,6 @@ elf32_mips_grok_psinfo (abfd, note) return true; } -#define PDR_SIZE 32 - -static boolean -elf32_mips_discard_info (abfd, cookie, info) - bfd *abfd; - struct elf_reloc_cookie *cookie; - struct bfd_link_info *info; -{ - asection *o; - boolean ret = false; - unsigned char *tdata; - size_t i, skip; - - o = bfd_get_section_by_name (abfd, ".pdr"); - if (! o) - return false; - if (o->_raw_size == 0) - return false; - if (o->_raw_size % PDR_SIZE != 0) - return false; - if (o->output_section != NULL - && bfd_is_abs_section (o->output_section)) - return false; - - tdata = bfd_zmalloc (o->_raw_size / PDR_SIZE); - if (! tdata) - return false; - - cookie->rels = _bfd_elf32_link_read_relocs (abfd, o, (PTR) NULL, - (Elf_Internal_Rela *) NULL, - info->keep_memory); - if (!cookie->rels) - { - free (tdata); - return false; - } - - cookie->rel = cookie->rels; - cookie->relend = cookie->rels + o->reloc_count; - - for (i = 0, skip = 0; i < o->_raw_size; i ++) - { - if (_bfd_elf32_reloc_symbol_deleted_p (i * PDR_SIZE, cookie)) - { - tdata[i] = 1; - skip ++; - } - } - - if (skip != 0) - { - elf_section_data (o)->tdata = tdata; - o->_cooked_size = o->_raw_size - skip * PDR_SIZE; - ret = true; - } - else - free (tdata); - - if (! info->keep_memory) - free (cookie->rels); - - return ret; -} - -static boolean -elf32_mips_write_section (output_bfd, sec, contents) - bfd *output_bfd; - asection *sec; - bfd_byte *contents; -{ - bfd_byte *to, *from, *end; - int i; - - if (strcmp (sec->name, ".pdr") != 0) - return false; - - if (elf_section_data (sec)->tdata == NULL) - return false; - - to = contents; - end = contents + sec->_raw_size; - for (from = contents, i = 0; - from < end; - from += PDR_SIZE, i++) - { - if (((unsigned char *)elf_section_data (sec)->tdata)[i] == 1) - continue; - if (to != from) - memcpy (to, from, PDR_SIZE); - to += PDR_SIZE; - } - bfd_set_section_contents (output_bfd, sec->output_section, contents, - (file_ptr) sec->output_offset, - sec->_cooked_size); - return true; -} - /* Depending on the target vector we generate some version of Irix executables or "normal" MIPS ELF ABI executables. */ static irix_compat_t @@ -2007,10 +1906,9 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define elf_backend_default_use_rela_p 0 #define elf_backend_sign_extend_vma true -#define elf_backend_discard_info elf32_mips_discard_info +#define elf_backend_discard_info _bfd_mips_elf_discard_info #define elf_backend_ignore_discarded_relocs \ _bfd_mips_elf_ignore_discarded_relocs -#define elf_backend_write_section elf32_mips_write_section #define elf_backend_mips_irix_compat elf32_mips_irix_compat #define elf_backend_mips_rtype_to_howto mips_elf32_rtype_to_howto #define bfd_elf32_bfd_is_local_label_name \ diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index ea8f645..6fed5c1 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -2736,6 +2736,10 @@ const struct elf_size_info mips_elf64_size_info = #define elf_backend_may_use_rela_p 1 #define elf_backend_default_use_rela_p 1 +#define elf_backend_ignore_discarded_relocs \ + _bfd_mips_elf_ignore_discarded_relocs +#define elf_backend_write_section _bfd_mips_elf_write_section + /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit MIPS-specific function only applies to IRIX5, which had no 64-bit ABI. */ diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 8ae1930..3084885 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -6415,6 +6415,70 @@ _bfd_mips_elf_hide_symbol (info, entry, force_local) got->_raw_size += MIPS_ELF_GOT_SIZE (dynobj); } +#define PDR_SIZE 32 + +boolean +_bfd_mips_elf_discard_info (abfd, cookie, info) + bfd *abfd; + struct elf_reloc_cookie *cookie; + struct bfd_link_info *info; +{ + asection *o; + boolean ret = false; + unsigned char *tdata; + size_t i, skip; + + o = bfd_get_section_by_name (abfd, ".pdr"); + if (! o) + return false; + if (o->_raw_size == 0) + return false; + if (o->_raw_size % PDR_SIZE != 0) + return false; + if (o->output_section != NULL + && bfd_is_abs_section (o->output_section)) + return false; + + tdata = bfd_zmalloc (o->_raw_size / PDR_SIZE); + if (! tdata) + return false; + + cookie->rels = _bfd_elf32_link_read_relocs (abfd, o, (PTR) NULL, + (Elf_Internal_Rela *) NULL, + info->keep_memory); + if (!cookie->rels) + { + free (tdata); + return false; + } + + cookie->rel = cookie->rels; + cookie->relend = cookie->rels + o->reloc_count; + + for (i = 0, skip = 0; i < o->_raw_size; i ++) + { + if (_bfd_elf32_reloc_symbol_deleted_p (i * PDR_SIZE, cookie)) + { + tdata[i] = 1; + skip ++; + } + } + + if (skip != 0) + { + elf_section_data (o)->tdata = tdata; + o->_cooked_size = o->_raw_size - skip * PDR_SIZE; + ret = true; + } + else + free (tdata); + + if (! info->keep_memory) + free (cookie->rels); + + return ret; +} + boolean _bfd_mips_elf_ignore_discarded_relocs (sec) asection *sec; @@ -6423,6 +6487,39 @@ _bfd_mips_elf_ignore_discarded_relocs (sec) return true; return false; } + +boolean +_bfd_mips_elf_write_section (output_bfd, sec, contents) + bfd *output_bfd; + asection *sec; + bfd_byte *contents; +{ + bfd_byte *to, *from, *end; + int i; + + if (strcmp (sec->name, ".pdr") != 0) + return false; + + if (elf_section_data (sec)->tdata == NULL) + return false; + + to = contents; + end = contents + sec->_raw_size; + for (from = contents, i = 0; + from < end; + from += PDR_SIZE, i++) + { + if (((unsigned char *) elf_section_data (sec)->tdata)[i] == 1) + continue; + if (to != from) + memcpy (to, from, PDR_SIZE); + to += PDR_SIZE; + } + bfd_set_section_contents (output_bfd, sec->output_section, contents, + (file_ptr) sec->output_offset, + sec->_cooked_size); + return true; +} /* MIPS ELF uses a special find_nearest_line routine in order the handle the ECOFF debugging information. */ diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h index 47c8c89..2bdaacc 100644 --- a/bfd/elfxx-mips.h +++ b/bfd/elfxx-mips.h @@ -91,6 +91,10 @@ extern boolean _bfd_mips_elf_set_private_flags PARAMS ((bfd *, flagword)); extern boolean _bfd_mips_elf_print_private_bfd_data PARAMS ((bfd *, PTR)); +extern boolean _bfd_mips_elf_discard_info + PARAMS ((bfd *, struct elf_reloc_cookie *, struct bfd_link_info *)); +extern boolean _bfd_mips_elf_write_section + PARAMS ((bfd *, asection *, bfd_byte *)); extern boolean _bfd_mips_elf_read_ecoff_info PARAMS ((bfd *, asection *, struct ecoff_debug_info *)); |