diff options
author | Ian Lance Taylor <ian@airs.com> | 1996-06-19 16:30:27 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1996-06-19 16:30:27 +0000 |
commit | 7fc6a16a7f38dcf16be6852fc303aa9dd32838ad (patch) | |
tree | cb04790dad87ea4e148f7f1433ef1228aeaa27cf /bfd | |
parent | 492b9bf04421df84de616fff0936a690d595bb7f (diff) | |
download | gdb-7fc6a16a7f38dcf16be6852fc303aa9dd32838ad.zip gdb-7fc6a16a7f38dcf16be6852fc303aa9dd32838ad.tar.gz gdb-7fc6a16a7f38dcf16be6852fc303aa9dd32838ad.tar.bz2 |
* elf.c (map_sections_to_segments): Fix up the test for -Ttext to
approximate the correct answer if SIZEOF_HEADERS was not used.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 3 | ||||
-rw-r--r-- | bfd/elf.c | 122 |
2 files changed, 117 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d2e98c8..70f7005 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,8 @@ Wed Jun 19 11:37:52 1996 Ian Lance Taylor <ian@cygnus.com> + * elf.c (map_sections_to_segments): Fix up the test for -Ttext to + approximate the correct answer if SIZEOF_HEADERS was not used. + * binary.c (binary_set_section_contents): Set section file position based on LMA rather than VMA. @@ -1734,12 +1734,20 @@ map_sections_to_segments (abfd) && (dynsec->flags & SEC_LOAD) == 0) dynsec = NULL; - /* Deal with -Ttext or something similar such that the - first section is not adjacent to the program headers. */ - if (count - && ((sections[0]->lma % maxpagesize) < - (elf_tdata (abfd)->program_header_size % maxpagesize))) - phdr_in_section = false; + /* Deal with -Ttext or something similar such that the first section + is not adjacent to the program headers. This is an + approximation, since at this point we don't know exactly how many + program headers we will need. */ + if (count > 0) + { + bfd_size_type phdr_size; + + phdr_size = elf_tdata (abfd)->program_header_size; + if (phdr_size == 0) + phdr_size = get_elf_backend_data (abfd)->s->sizeof_phdr; + if (sections[0]->lma % maxpagesize < phdr_size % maxpagesize) + phdr_in_section = false; + } for (i = 0, hdrpp = sections; i < count; i++, hdrpp++) { @@ -2582,9 +2590,9 @@ _bfd_elf_section_from_bfd_section (abfd, asect) int _bfd_elf_symbol_from_bfd_symbol (abfd, asym_ptr_ptr) bfd *abfd; - struct symbol_cache_entry **asym_ptr_ptr; + asymbol **asym_ptr_ptr; { - struct symbol_cache_entry *asym_ptr = *asym_ptr_ptr; + asymbol *asym_ptr = *asym_ptr_ptr; int idx; flagword flags = asym_ptr->flags; @@ -3316,3 +3324,101 @@ _bfd_elf_no_info_to_howto_rel (abfd, cache_ptr, dst) abort (); } #endif + +/* Try to convert a non-ELF reloc into an ELF one. */ + +boolean +_bfd_elf_validate_reloc (abfd, areloc) + bfd *abfd; + arelent *areloc; +{ + /* Check whether we really have an ELF howto. */ + + if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec) + { + bfd_reloc_code_real_type code; + reloc_howto_type *howto; + + /* Alien reloc: Try to determine its type to replace it with an + equivalent ELF reloc. */ + + if (areloc->howto->pc_relative) + { + switch (areloc->howto->bitsize) + { + case 8: + code = BFD_RELOC_8_PCREL; + break; + case 12: + code = BFD_RELOC_12_PCREL; + break; + case 16: + code = BFD_RELOC_16_PCREL; + break; + case 24: + code = BFD_RELOC_24_PCREL; + break; + case 32: + code = BFD_RELOC_32_PCREL; + break; + case 64: + code = BFD_RELOC_64_PCREL; + break; + default: + goto fail; + } + + howto = bfd_reloc_type_lookup (abfd, code); + + if (areloc->howto->pcrel_offset != howto->pcrel_offset) + { + if (howto->pcrel_offset) + areloc->addend += areloc->address; + else + areloc->addend -= areloc->address; /* addend is unsigned!! */ + } + } + else + { + switch (areloc->howto->bitsize) + { + case 8: + code = BFD_RELOC_8; + break; + case 14: + code = BFD_RELOC_14; + break; + case 16: + code = BFD_RELOC_16; + break; + case 26: + code = BFD_RELOC_26; + break; + case 32: + code = BFD_RELOC_32; + break; + case 64: + code = BFD_RELOC_64; + break; + default: + goto fail; + } + + howto = bfd_reloc_type_lookup (abfd, code); + } + + if (howto) + areloc->howto = howto; + else + goto fail; + } + + return true; + + fail: + (*_bfd_error_handler) + ("%s: unsupported relocation type %s", + bfd_get_filename (abfd), areloc->howto->name); + bfd_set_error (bfd_error_bad_value); + return false; +} |