* elf.c (_bfd_elf_rela_local_sym): New.
* elflink.h (elf_link_input_bfd): Don't consider empty merged sections as removed in relocation tests. * elf-bfd.h (_bfd_elf_rela_local_sym): Add prototype. * elf32-i386.c (elf_i386_relocate_section): Handle relocs against STT_SECTION symbol of SHF_MERGE section. * elf32-arm.h (elf32_arm_relocate_section): Likewise. * elf32-avr.c (elf32_avr_relocate_section): Call _bfd_elf_rela_local_sym. * elf32-cris.c (cris_elf_relocate_section): Likewise. * elf32-d10v.c (elf32_d10v_relocate_section): Likewise. * elf32-fr30.c (fr30_final_link_relocate): Likewise. * elf32-h8300.c (elf32_h8_relocate_section): Likewise. * elf32-hppa.c (elf32_hppa_relocate_section): Likewise. * elf32-i370.c (i370_elf_relocate_section): Likewise. * elf32-i860.c (elf32_i860_relocate_section): Likewise. * elf32-m32r.c (m32r_elf_relocate_section): Likewise. * elf32-m68k.c (elf_m68k_relocate_section): Likewise. * elf32-mcore.c (mcore_elf_relocate_section): Likewise. * elf32-openrisc.c (openrisc_elf_relocate_section): Likewise. * elf32-ppc.c (ppc_elf_relocate_section): Likewise. * elf32-s390.c (elf_s390_relocate_section): Likewise. * elf32-sparc.c (elf32_sparc_relocate_section): Likewise. * elf32-v850.c (v850_elf_relocate_section): Likewise. * elf64-alpha.c (elf64_alpha_relocate_section): Likewise. * elf64-mmix.c (mmix_elf_relocate_section): Likewise. * elf64-ppc.c (ppc64_elf_relocate_section): Likewise. * elf64-s390.c (elf_s390_relocate_section): Likewise. * elf64-sparc.c (sparc64_elf_relocate_section): Likewise. * elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise. * elf-hppa.h (elf_hppa_relocate_section): Likewise. * elf-m10200.c (mn10200_elf_relocate_section): Likewise. * elf-m10300.c (mn10300_elf_relocate_section): Likewise. * elfxx-ia64.c (elfNN_ia64_relocate_section): Likewise. * elf32-sh.c (sh_elf_relocate_section): Likewise for !partial_inplace relocs. Handle relocs against STT_SECTION symbol of SHF_MERGE for partial_inplace relocs. * config/tc-alpha.c (tc_gen_reloc): Remove SEC_MERGE test. * write.c (adjust_reloc_syms): Don't handle relocs against SEC_MERGE section symbols specially. (fixup_segment): Likewise.
This commit is contained in:
parent
c6843df52b
commit
f8df10f4f5
36 changed files with 227 additions and 96 deletions
|
@ -1,3 +1,43 @@
|
||||||
|
2001-11-23 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* elf.c (_bfd_elf_rela_local_sym): New.
|
||||||
|
* elflink.h (elf_link_input_bfd): Don't consider empty
|
||||||
|
merged sections as removed in relocation tests.
|
||||||
|
* elf-bfd.h (_bfd_elf_rela_local_sym): Add prototype.
|
||||||
|
* elf32-i386.c (elf_i386_relocate_section): Handle relocs
|
||||||
|
against STT_SECTION symbol of SHF_MERGE section.
|
||||||
|
* elf32-arm.h (elf32_arm_relocate_section): Likewise.
|
||||||
|
* elf32-avr.c (elf32_avr_relocate_section): Call
|
||||||
|
_bfd_elf_rela_local_sym.
|
||||||
|
* elf32-cris.c (cris_elf_relocate_section): Likewise.
|
||||||
|
* elf32-d10v.c (elf32_d10v_relocate_section): Likewise.
|
||||||
|
* elf32-fr30.c (fr30_final_link_relocate): Likewise.
|
||||||
|
* elf32-h8300.c (elf32_h8_relocate_section): Likewise.
|
||||||
|
* elf32-hppa.c (elf32_hppa_relocate_section): Likewise.
|
||||||
|
* elf32-i370.c (i370_elf_relocate_section): Likewise.
|
||||||
|
* elf32-i860.c (elf32_i860_relocate_section): Likewise.
|
||||||
|
* elf32-m32r.c (m32r_elf_relocate_section): Likewise.
|
||||||
|
* elf32-m68k.c (elf_m68k_relocate_section): Likewise.
|
||||||
|
* elf32-mcore.c (mcore_elf_relocate_section): Likewise.
|
||||||
|
* elf32-openrisc.c (openrisc_elf_relocate_section): Likewise.
|
||||||
|
* elf32-ppc.c (ppc_elf_relocate_section): Likewise.
|
||||||
|
* elf32-s390.c (elf_s390_relocate_section): Likewise.
|
||||||
|
* elf32-sparc.c (elf32_sparc_relocate_section): Likewise.
|
||||||
|
* elf32-v850.c (v850_elf_relocate_section): Likewise.
|
||||||
|
* elf64-alpha.c (elf64_alpha_relocate_section): Likewise.
|
||||||
|
* elf64-mmix.c (mmix_elf_relocate_section): Likewise.
|
||||||
|
* elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
|
||||||
|
* elf64-s390.c (elf_s390_relocate_section): Likewise.
|
||||||
|
* elf64-sparc.c (sparc64_elf_relocate_section): Likewise.
|
||||||
|
* elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise.
|
||||||
|
* elf-hppa.h (elf_hppa_relocate_section): Likewise.
|
||||||
|
* elf-m10200.c (mn10200_elf_relocate_section): Likewise.
|
||||||
|
* elf-m10300.c (mn10300_elf_relocate_section): Likewise.
|
||||||
|
* elfxx-ia64.c (elfNN_ia64_relocate_section): Likewise.
|
||||||
|
* elf32-sh.c (sh_elf_relocate_section): Likewise for
|
||||||
|
!partial_inplace relocs. Handle relocs against STT_SECTION
|
||||||
|
symbol of SHF_MERGE for partial_inplace relocs.
|
||||||
|
|
||||||
2001-11-21 Nick Clifton <nickc@cambridge.redhat.com>
|
2001-11-21 Nick Clifton <nickc@cambridge.redhat.com>
|
||||||
|
|
||||||
* po/Make-in (distclean): Move SRC-POTFILES.in and
|
* po/Make-in (distclean): Move SRC-POTFILES.in and
|
||||||
|
|
|
@ -1140,6 +1140,8 @@ extern void _bfd_elf_fprintf_vma
|
||||||
|
|
||||||
extern enum elf_reloc_type_class _bfd_elf_reloc_type_class
|
extern enum elf_reloc_type_class _bfd_elf_reloc_type_class
|
||||||
PARAMS ((const Elf_Internal_Rela *));
|
PARAMS ((const Elf_Internal_Rela *));
|
||||||
|
extern bfd_vma _bfd_elf_rela_local_sym
|
||||||
|
PARAMS ((bfd *, Elf_Internal_Sym *, asection *, Elf_Internal_Rela *));
|
||||||
|
|
||||||
extern unsigned long bfd_elf_hash
|
extern unsigned long bfd_elf_hash
|
||||||
PARAMS ((const char *));
|
PARAMS ((const char *));
|
||||||
|
|
|
@ -1325,10 +1325,7 @@ elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
/* This is a local symbol. */
|
/* This is a local symbol. */
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sym_sec = local_sections[r_symndx];
|
sym_sec = local_sections[r_symndx];
|
||||||
relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel);
|
||||||
? 0 : sym->st_value)
|
|
||||||
+ sym_sec->output_offset
|
|
||||||
+ sym_sec->output_section->vma);
|
|
||||||
|
|
||||||
/* If this symbol has an entry in the PA64 dynamic hash
|
/* If this symbol has an entry in the PA64 dynamic hash
|
||||||
table, then get it. */
|
table, then get it. */
|
||||||
|
|
|
@ -394,9 +394,7 @@ mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -610,9 +610,7 @@ mn10300_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
32
bfd/elf.c
32
bfd/elf.c
|
@ -6370,3 +6370,35 @@ _bfd_elf_reloc_type_class (rela)
|
||||||
{
|
{
|
||||||
return reloc_class_normal;
|
return reloc_class_normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For RELA architectures, return what the relocation value for
|
||||||
|
relocation against a local symbol. */
|
||||||
|
|
||||||
|
bfd_vma
|
||||||
|
_bfd_elf_rela_local_sym (abfd, sym, sec, rel)
|
||||||
|
bfd *abfd;
|
||||||
|
Elf_Internal_Sym *sym;
|
||||||
|
asection *sec;
|
||||||
|
Elf_Internal_Rela *rel;
|
||||||
|
{
|
||||||
|
bfd_vma relocation;
|
||||||
|
|
||||||
|
relocation = (sec->output_section->vma
|
||||||
|
+ sec->output_offset
|
||||||
|
+ sym->st_value);
|
||||||
|
if ((sec->flags & SEC_MERGE)
|
||||||
|
&& ELF_ST_TYPE (sym->st_info) == STT_SECTION)
|
||||||
|
{
|
||||||
|
asection *msec;
|
||||||
|
|
||||||
|
msec = sec;
|
||||||
|
rel->r_addend =
|
||||||
|
_bfd_merged_section_offset (abfd, &msec,
|
||||||
|
elf_section_data (sec)->merge_info,
|
||||||
|
sym->st_value + rel->r_addend,
|
||||||
|
(bfd_vma) 0)
|
||||||
|
- relocation;
|
||||||
|
rel->r_addend += msec->output_section->vma + msec->output_offset;
|
||||||
|
}
|
||||||
|
return relocation;
|
||||||
|
}
|
||||||
|
|
|
@ -1858,9 +1858,51 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
|
#ifdef USE_REL
|
||||||
relocation = (sec->output_section->vma
|
relocation = (sec->output_section->vma
|
||||||
+ sec->output_offset
|
+ sec->output_offset
|
||||||
+ sym->st_value);
|
+ sym->st_value);
|
||||||
|
if ((sec->flags & SEC_MERGE)
|
||||||
|
&& ELF_ST_TYPE (sym->st_info) == STT_SECTION)
|
||||||
|
{
|
||||||
|
asection *msec;
|
||||||
|
bfd_vma addend, value;
|
||||||
|
|
||||||
|
if (howto->rightshift)
|
||||||
|
{
|
||||||
|
(*_bfd_error_handler)
|
||||||
|
(_("%s(%s+0x%lx): %s relocation against SEC_MERGE section"),
|
||||||
|
bfd_archive_filename (input_bfd),
|
||||||
|
bfd_get_section_name (input_bfd, input_section),
|
||||||
|
(long) rel->r_offset, howto->name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||||
|
|
||||||
|
/* Get the (signed) value from the instruction. */
|
||||||
|
addend = value & howto->src_mask;
|
||||||
|
if (addend & ((howto->src_mask + 1) >> 1))
|
||||||
|
{
|
||||||
|
bfd_signed_vma mask;
|
||||||
|
|
||||||
|
mask = -1;
|
||||||
|
mask &= ~ howto->src_mask;
|
||||||
|
addend |= mask;
|
||||||
|
}
|
||||||
|
msec = sec;
|
||||||
|
addend =
|
||||||
|
_bfd_merged_section_offset (output_bfd, &msec,
|
||||||
|
elf_section_data (sec)->merge_info,
|
||||||
|
sym->st_value + addend, (bfd_vma) 0)
|
||||||
|
- relocation;
|
||||||
|
addend += msec->output_section->vma + msec->output_offset;
|
||||||
|
value = (value & ~ howto->dst_mask) | (addend & howto->dst_mask);
|
||||||
|
bfd_put_32 (input_bfd, value, contents + rel->r_offset);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -778,9 +778,7 @@ elf32_avr_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections [r_symndx];
|
sec = local_sections [r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
|
|
||||||
name = bfd_elf_string_from_elf_section
|
name = bfd_elf_string_from_elf_section
|
||||||
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
||||||
|
|
|
@ -870,9 +870,7 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections [r_symndx];
|
sec = local_sections [r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
|
|
||||||
symname = (bfd_elf_string_from_elf_section
|
symname = (bfd_elf_string_from_elf_section
|
||||||
(input_bfd, symtab_hdr->sh_link, sym->st_name));
|
(input_bfd, symtab_hdr->sh_link, sym->st_name));
|
||||||
|
|
|
@ -356,7 +356,7 @@ elf32_d10v_check_relocs (abfd, info, sec, relocs)
|
||||||
static boolean
|
static boolean
|
||||||
elf32_d10v_relocate_section (output_bfd, info, input_bfd, input_section,
|
elf32_d10v_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
contents, relocs, local_syms, local_sections)
|
contents, relocs, local_syms, local_sections)
|
||||||
bfd *output_bfd ATTRIBUTE_UNUSED;
|
bfd *output_bfd;
|
||||||
struct bfd_link_info *info;
|
struct bfd_link_info *info;
|
||||||
bfd *input_bfd;
|
bfd *input_bfd;
|
||||||
asection *input_section;
|
asection *input_section;
|
||||||
|
@ -422,9 +422,7 @@ elf32_d10v_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -503,7 +503,7 @@ fr30_final_link_relocate (howto, input_bfd, input_section, contents, rel, reloca
|
||||||
static boolean
|
static boolean
|
||||||
fr30_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
fr30_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
contents, relocs, local_syms, local_sections)
|
contents, relocs, local_syms, local_sections)
|
||||||
bfd * output_bfd ATTRIBUTE_UNUSED;
|
bfd * output_bfd;
|
||||||
struct bfd_link_info * info;
|
struct bfd_link_info * info;
|
||||||
bfd * input_bfd;
|
bfd * input_bfd;
|
||||||
asection * input_section;
|
asection * input_section;
|
||||||
|
@ -571,9 +571,7 @@ fr30_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections [r_symndx];
|
sec = local_sections [r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
|
|
||||||
name = bfd_elf_string_from_elf_section
|
name = bfd_elf_string_from_elf_section
|
||||||
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
||||||
|
|
|
@ -473,9 +473,7 @@ elf32_h8_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -3650,10 +3650,7 @@ elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
/* This is a local symbol, h defaults to NULL. */
|
/* This is a local symbol, h defaults to NULL. */
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sym_sec = local_sections[r_symndx];
|
sym_sec = local_sections[r_symndx];
|
||||||
relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel);
|
||||||
? 0 : sym->st_value)
|
|
||||||
+ sym_sec->output_offset
|
|
||||||
+ sym_sec->output_section->vma);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1367,9 +1367,8 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
sym_name = "<local symbol>";
|
sym_name = "<local symbol>";
|
||||||
|
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
addend = rel->r_addend;
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1770,6 +1770,32 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
relocation = (sec->output_section->vma
|
relocation = (sec->output_section->vma
|
||||||
+ sec->output_offset
|
+ sec->output_offset
|
||||||
+ sym->st_value);
|
+ sym->st_value);
|
||||||
|
if ((sec->flags & SEC_MERGE)
|
||||||
|
&& ELF_ST_TYPE (sym->st_info) == STT_SECTION)
|
||||||
|
{
|
||||||
|
asection *msec;
|
||||||
|
bfd_vma addend;
|
||||||
|
|
||||||
|
if (howto->src_mask != 0xffffffff)
|
||||||
|
{
|
||||||
|
(*_bfd_error_handler)
|
||||||
|
(_("%s(%s+0x%lx): %s relocation against SEC_MERGE section"),
|
||||||
|
bfd_archive_filename (input_bfd),
|
||||||
|
bfd_get_section_name (input_bfd, input_section),
|
||||||
|
(long) rel->r_offset, howto->name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||||
|
msec = sec;
|
||||||
|
addend =
|
||||||
|
_bfd_merged_section_offset (output_bfd, &msec,
|
||||||
|
elf_section_data (sec)->merge_info,
|
||||||
|
sym->st_value + addend, (bfd_vma) 0)
|
||||||
|
- relocation;
|
||||||
|
addend += msec->output_section->vma + msec->output_offset;
|
||||||
|
bfd_put_32 (input_bfd, addend, contents + rel->r_offset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -934,9 +934,7 @@ elf32_i860_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections [r_symndx];
|
sec = local_sections [r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
|
|
||||||
name = bfd_elf_string_from_elf_section
|
name = bfd_elf_string_from_elf_section
|
||||||
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
||||||
|
|
|
@ -1106,9 +1106,16 @@ m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
sym_name = "<local symbol>";
|
sym_name = "<local symbol>";
|
||||||
|
#ifndef USE_REL
|
||||||
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
|
addend = rel->r_addend;
|
||||||
|
#else
|
||||||
|
/* FIXME: This won't handle local relocations against SEC_MERGE
|
||||||
|
symbols. See elf32-i386.c for how to do this. */
|
||||||
relocation = (sec->output_section->vma
|
relocation = (sec->output_section->vma
|
||||||
+ sec->output_offset
|
+ sec->output_offset
|
||||||
+ sym->st_value);
|
+ sym->st_value);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1389,9 +1389,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -410,7 +410,7 @@ mcore_elf_unsupported_reloc (abfd, reloc_entry, symbol, data, input_section,
|
||||||
static boolean
|
static boolean
|
||||||
mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
contents, relocs, local_syms, local_sections)
|
contents, relocs, local_syms, local_sections)
|
||||||
bfd * output_bfd ATTRIBUTE_UNUSED;
|
bfd * output_bfd;
|
||||||
struct bfd_link_info * info;
|
struct bfd_link_info * info;
|
||||||
bfd * input_bfd;
|
bfd * input_bfd;
|
||||||
asection * input_section;
|
asection * input_section;
|
||||||
|
@ -510,9 +510,8 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections [r_symndx];
|
sec = local_sections [r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
addend = rel->r_addend;
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -324,7 +324,7 @@ openrisc_final_link_relocate (howto, input_bfd, input_section, contents, rel,
|
||||||
static boolean
|
static boolean
|
||||||
openrisc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
openrisc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
contents, relocs, local_syms, local_sections)
|
contents, relocs, local_syms, local_sections)
|
||||||
bfd *output_bfd ATTRIBUTE_UNUSED;
|
bfd *output_bfd;
|
||||||
struct bfd_link_info *info;
|
struct bfd_link_info *info;
|
||||||
bfd *input_bfd;
|
bfd *input_bfd;
|
||||||
asection *input_section;
|
asection *input_section;
|
||||||
|
@ -394,8 +394,7 @@ openrisc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset + sym->st_value);
|
|
||||||
|
|
||||||
name = bfd_elf_string_from_elf_section
|
name = bfd_elf_string_from_elf_section
|
||||||
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
||||||
|
|
|
@ -2998,9 +2998,8 @@ ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
sym_name = "<local symbol>";
|
sym_name = "<local symbol>";
|
||||||
|
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
addend = rel->r_addend;
|
||||||
+ sym->st_value);
|
|
||||||
/* Relocs to local symbols are always resolved. */
|
/* Relocs to local symbols are always resolved. */
|
||||||
will_become_local = 1;
|
will_become_local = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1664,9 +1664,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -2960,7 +2960,7 @@ sh_elf_discard_copies (h, ignore)
|
||||||
static boolean
|
static boolean
|
||||||
sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
contents, relocs, local_syms, local_sections)
|
contents, relocs, local_syms, local_sections)
|
||||||
bfd *output_bfd ATTRIBUTE_UNUSED;
|
bfd *output_bfd;
|
||||||
struct bfd_link_info *info;
|
struct bfd_link_info *info;
|
||||||
bfd *input_bfd;
|
bfd *input_bfd;
|
||||||
asection *input_section;
|
asection *input_section;
|
||||||
|
@ -3041,7 +3041,6 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
relocation = (sec->output_section->vma
|
relocation = (sec->output_section->vma
|
||||||
+ sec->output_offset
|
+ sec->output_offset
|
||||||
+ sym->st_value);
|
+ sym->st_value);
|
||||||
|
|
||||||
if (info->relocateable)
|
if (info->relocateable)
|
||||||
{
|
{
|
||||||
/* This is a relocateable link. We don't have to change
|
/* This is a relocateable link. We don't have to change
|
||||||
|
@ -3079,6 +3078,37 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if (! howto->partial_inplace)
|
||||||
|
{
|
||||||
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
|
addend = rel->r_addend;
|
||||||
|
}
|
||||||
|
else if ((sec->flags & SEC_MERGE)
|
||||||
|
&& ELF_ST_TYPE (sym->st_info) == STT_SECTION)
|
||||||
|
{
|
||||||
|
asection *msec;
|
||||||
|
|
||||||
|
if (howto->rightshift || howto->src_mask != 0xffffffff)
|
||||||
|
{
|
||||||
|
(*_bfd_error_handler)
|
||||||
|
(_("%s(%s+0x%lx): %s relocation against SEC_MERGE section"),
|
||||||
|
bfd_archive_filename (input_bfd),
|
||||||
|
bfd_get_section_name (input_bfd, input_section),
|
||||||
|
(long) rel->r_offset, howto->name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||||
|
msec = sec;
|
||||||
|
addend =
|
||||||
|
_bfd_merged_section_offset (output_bfd, &msec,
|
||||||
|
elf_section_data (sec)->merge_info,
|
||||||
|
sym->st_value + addend, (bfd_vma) 0)
|
||||||
|
- relocation;
|
||||||
|
addend += msec->output_section->vma + msec->output_offset;
|
||||||
|
bfd_put_32 (input_bfd, addend, contents + rel->r_offset);
|
||||||
|
addend = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1176,9 +1176,7 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1597,9 +1597,7 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
#if 0
|
#if 0
|
||||||
{
|
{
|
||||||
char * name;
|
char * name;
|
||||||
|
|
|
@ -3318,9 +3318,7 @@ elf64_alpha_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1091,9 +1091,7 @@ mmix_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections [r_symndx];
|
sec = local_sections [r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
|
|
||||||
name = bfd_elf_string_from_elf_section
|
name = bfd_elf_string_from_elf_section
|
||||||
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
(input_bfd, symtab_hdr->sh_link, sym->st_name);
|
||||||
|
|
|
@ -3140,9 +3140,8 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
sym_name = "<local symbol>";
|
sym_name = "<local symbol>";
|
||||||
|
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
addend = rel->r_addend;
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1643,9 +1643,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1969,9 +1969,7 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1229,9 +1229,7 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
{
|
{
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sec = local_sections[r_symndx];
|
sec = local_sections[r_symndx];
|
||||||
relocation = (sec->output_section->vma
|
relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rela);
|
||||||
+ sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -6317,7 +6317,9 @@ elf_link_input_bfd (finfo, input_bfd)
|
||||||
|| h->root.type == bfd_link_hash_defweak)
|
|| h->root.type == bfd_link_hash_defweak)
|
||||||
&& ! bfd_is_abs_section (h->root.u.def.section)
|
&& ! bfd_is_abs_section (h->root.u.def.section)
|
||||||
&& bfd_is_abs_section (h->root.u.def.section
|
&& bfd_is_abs_section (h->root.u.def.section
|
||||||
->output_section))
|
->output_section)
|
||||||
|
&& elf_section_data (h->root.u.def.section)->merge_info
|
||||||
|
== NULL)
|
||||||
{
|
{
|
||||||
#if BFD_VERSION_DATE < 20031005
|
#if BFD_VERSION_DATE < 20031005
|
||||||
if ((o->flags & SEC_DEBUGGING) != 0)
|
if ((o->flags & SEC_DEBUGGING) != 0)
|
||||||
|
@ -6348,7 +6350,8 @@ elf_link_input_bfd (finfo, input_bfd)
|
||||||
|
|
||||||
if (sec != NULL
|
if (sec != NULL
|
||||||
&& ! bfd_is_abs_section (sec)
|
&& ! bfd_is_abs_section (sec)
|
||||||
&& bfd_is_abs_section (sec->output_section))
|
&& bfd_is_abs_section (sec->output_section)
|
||||||
|
&& elf_section_data (sec)->merge_info == NULL)
|
||||||
{
|
{
|
||||||
#if BFD_VERSION_DATE < 20031005
|
#if BFD_VERSION_DATE < 20031005
|
||||||
if ((o->flags & SEC_DEBUGGING) != 0
|
if ((o->flags & SEC_DEBUGGING) != 0
|
||||||
|
|
|
@ -3481,9 +3481,7 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
/* Reloc against local symbol. */
|
/* Reloc against local symbol. */
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
sym_sec = local_sections[r_symndx];
|
sym_sec = local_sections[r_symndx];
|
||||||
value = (sym_sec->output_section->vma
|
value = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel);
|
||||||
+ sym_sec->output_offset
|
|
||||||
+ sym->st_value);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
2001-11-23 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* config/tc-alpha.c (tc_gen_reloc): Remove SEC_MERGE test.
|
||||||
|
* write.c (adjust_reloc_syms): Don't handle relocs against
|
||||||
|
SEC_MERGE section symbols specially.
|
||||||
|
(fixup_segment): Likewise.
|
||||||
|
|
||||||
2001-11-21 Richard Sandiford <rsandifo@redhat.com>
|
2001-11-21 Richard Sandiford <rsandifo@redhat.com>
|
||||||
|
|
||||||
* config/tc-mips.c (mips_need_elf_addend_fixup): New, extracted from...
|
* config/tc-mips.c (mips_need_elf_addend_fixup): New, extracted from...
|
||||||
|
|
|
@ -1507,8 +1507,7 @@ tc_gen_reloc (sec, fixp)
|
||||||
* at assembly time. bfd_perform_reloc doesn't know about this sort
|
* at assembly time. bfd_perform_reloc doesn't know about this sort
|
||||||
* of thing, and as a result we need to fake it out here.
|
* of thing, and as a result we need to fake it out here.
|
||||||
*/
|
*/
|
||||||
if ((S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)
|
if ((S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy))
|
||||||
|| (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE))
|
|
||||||
&& !S_IS_COMMON (fixp->fx_addsy))
|
&& !S_IS_COMMON (fixp->fx_addsy))
|
||||||
reloc->addend -= symbol_get_bfdsym (fixp->fx_addsy)->value;
|
reloc->addend -= symbol_get_bfdsym (fixp->fx_addsy)->value;
|
||||||
#endif
|
#endif
|
||||||
|
|
10
gas/write.c
10
gas/write.c
|
@ -873,13 +873,6 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||||
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Never adjust a reloc against local symbol in a merge section. */
|
|
||||||
if (symsec->flags & SEC_MERGE)
|
|
||||||
{
|
|
||||||
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Is there some other reason we can't adjust this one? (E.g.,
|
/* Is there some other reason we can't adjust this one? (E.g.,
|
||||||
|
@ -2815,9 +2808,6 @@ fixup_segment (fixP, this_segment_type)
|
||||||
else if (add_symbol_segment == undefined_section
|
else if (add_symbol_segment == undefined_section
|
||||||
#ifdef BFD_ASSEMBLER
|
#ifdef BFD_ASSEMBLER
|
||||||
|| bfd_is_com_section (add_symbol_segment)
|
|| bfd_is_com_section (add_symbol_segment)
|
||||||
|| (bfd_get_section_flags (stdoutput,
|
|
||||||
add_symbol_segment)
|
|
||||||
& SEC_MERGE) != 0
|
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue