diff options
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 28 | ||||
-rw-r--r-- | bfd/elf32-mips.c | 1 | ||||
-rw-r--r-- | bfd/elfcode.h | 28 | ||||
-rw-r--r-- | bfd/elfxx-target.h | 9 |
5 files changed, 58 insertions, 18 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a138c47..af1173c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +1999-11-17 Richard Henderson <rth@cygnus.com> + + * elf-bfd.h (struct elf_backend_data): Reorder collect and + type_change_ok; add sign_extend_vma. + * elf32-mips.c (elf_backend_sign_extend_vma): Define. + * elfcode.h (elf_swap_symbol_in): Mind be->sign_extend_vma. + (elf_swap_shdr_in, elf_swap_phdr_in): Likewise. + * elfxx-target.h (elf_backend_sign_extend_vma): Default. + (elfNN_bed): Follow struture changes. + 1999-11-09 Ian Lance Taylor <ian@zembu.com> * libbfd.c (bfd_read): Check result of read against desired result diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 1868cb6..8256b2f 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -332,18 +332,6 @@ struct elf_backend_data /* The maximum page size for this backend. */ bfd_vma maxpagesize; - /* This is true if the linker should act like collect and gather - global constructors and destructors by name. This is true for - MIPS ELF because the Irix 5 tools can not handle the .init - section. */ - boolean collect; - - /* This is true if the linker should ignore changes to the type of a - symbol. This is true for MIPS ELF because some Irix 5 objects - record undefined functions as STT_OBJECT although the definitions - are STT_FUNC. */ - boolean type_change_ok; - /* A function to translate an ELF RELA relocation to a BFD arelent structure. */ void (*elf_info_to_howto) PARAMS ((bfd *, arelent *, @@ -618,6 +606,18 @@ struct elf_backend_data bfd_vma got_header_size; bfd_vma plt_header_size; + /* This is true if the linker should act like collect and gather + global constructors and destructors by name. This is true for + MIPS ELF because the Irix 5 tools can not handle the .init + section. */ + unsigned collect : 1; + + /* This is true if the linker should ignore changes to the type of a + symbol. This is true for MIPS ELF because some Irix 5 objects + record undefined functions as STT_OBJECT although the definitions + are STT_FUNC. */ + unsigned type_change_ok : 1; + /* Whether the backend may use REL relocations. (Some backends use both REL and RELA relocations, and this flag is set for those backends.) */ @@ -635,6 +635,10 @@ struct elf_backend_data section. */ unsigned default_use_rela_p : 1; + /* True if addresses "naturally" sign extend. This is used when + swapping in from Elf32 when BFD64. */ + unsigned sign_extend_vma : 1; + unsigned want_got_plt : 1; unsigned plt_readonly : 1; unsigned want_plt_sym : 1; diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 0e7dd08..fe86862 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -8809,6 +8809,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = #define elf_backend_collect true #define elf_backend_type_change_ok true #define elf_backend_can_gc_sections true +#define elf_backend_sign_extend_vma true #define elf_info_to_howto mips_info_to_howto_rela #define elf_info_to_howto_rel mips_info_to_howto_rel #define elf_backend_sym_is_global mips_elf_sym_is_global diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 1f75fb0..c5edf9b 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -207,8 +207,13 @@ elf_swap_symbol_in (abfd, src, dst) const Elf_External_Sym *src; Elf_Internal_Sym *dst; { + int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; + dst->st_name = bfd_h_get_32 (abfd, (bfd_byte *) src->st_name); - dst->st_value = get_word (abfd, (bfd_byte *) src->st_value); + if (signed_vma) + dst->st_value = get_signed_word (abfd, (bfd_byte *) src->st_value); + else + dst->st_value = get_word (abfd, (bfd_byte *) src->st_value); dst->st_size = get_word (abfd, (bfd_byte *) src->st_size); dst->st_info = bfd_h_get_8 (abfd, (bfd_byte *) src->st_info); dst->st_other = bfd_h_get_8 (abfd, (bfd_byte *) src->st_other); @@ -295,10 +300,15 @@ elf_swap_shdr_in (abfd, src, dst) const Elf_External_Shdr *src; Elf_Internal_Shdr *dst; { + int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; + dst->sh_name = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_name); dst->sh_type = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_type); dst->sh_flags = get_word (abfd, (bfd_byte *) src->sh_flags); - dst->sh_addr = get_word (abfd, (bfd_byte *) src->sh_addr); + if (signed_vma) + dst->sh_addr = get_signed_word (abfd, (bfd_byte *) src->sh_addr); + else + dst->sh_addr = get_word (abfd, (bfd_byte *) src->sh_addr); dst->sh_offset = get_word (abfd, (bfd_byte *) src->sh_offset); dst->sh_size = get_word (abfd, (bfd_byte *) src->sh_size); dst->sh_link = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_link); @@ -341,11 +351,21 @@ elf_swap_phdr_in (abfd, src, dst) const Elf_External_Phdr *src; Elf_Internal_Phdr *dst; { + int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; + dst->p_type = bfd_h_get_32 (abfd, (bfd_byte *) src->p_type); dst->p_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->p_flags); dst->p_offset = get_word (abfd, (bfd_byte *) src->p_offset); - dst->p_vaddr = get_word (abfd, (bfd_byte *) src->p_vaddr); - dst->p_paddr = get_word (abfd, (bfd_byte *) src->p_paddr); + if (signed_vma) + { + dst->p_vaddr = get_signed_word (abfd, (bfd_byte *) src->p_vaddr); + dst->p_paddr = get_signed_word (abfd, (bfd_byte *) src->p_paddr); + } + else + { + dst->p_vaddr = get_word (abfd, (bfd_byte *) src->p_vaddr); + dst->p_paddr = get_word (abfd, (bfd_byte *) src->p_paddr); + } dst->p_filesz = get_word (abfd, (bfd_byte *) src->p_filesz); dst->p_memsz = get_word (abfd, (bfd_byte *) src->p_memsz); dst->p_align = get_word (abfd, (bfd_byte *) src->p_align); diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 3a787a2..2e7579b 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -338,6 +338,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define elf_backend_size_info _bfd_elfNN_size_info #endif +#ifndef elf_backend_sign_extend_vma +#define elf_backend_sign_extend_vma 0 +#endif + extern const struct elf_size_info _bfd_elfNN_size_info; static CONST struct elf_backend_data elfNN_bed = @@ -345,8 +349,6 @@ static CONST struct elf_backend_data elfNN_bed = ELF_ARCH, /* arch */ ELF_MACHINE_CODE, /* elf_machine_code */ ELF_MAXPAGESIZE, /* maxpagesize */ - elf_backend_collect, - elf_backend_type_change_ok, elf_info_to_howto, elf_info_to_howto_rel, elf_backend_sym_is_global, @@ -384,9 +386,12 @@ static CONST struct elf_backend_data elfNN_bed = elf_backend_got_symbol_offset, elf_backend_got_header_size, elf_backend_plt_header_size, + elf_backend_collect, + elf_backend_type_change_ok, elf_backend_may_use_rel_p, elf_backend_may_use_rela_p, elf_backend_default_use_rela_p, + elf_backend_sign_extend_vma, elf_backend_want_got_plt, elf_backend_plt_readonly, elf_backend_want_plt_sym, |