diff options
Diffstat (limited to 'bfd/elf32-vax.c')
-rw-r--r-- | bfd/elf32-vax.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c index 9caa47d..93cb1cb 100644 --- a/bfd/elf32-vax.c +++ b/bfd/elf32-vax.c @@ -605,6 +605,11 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, || h == elf_hash_table (info)->hplt) break; + /* If this is a local symbol, we resolve it directly without + creating a global offset table entry. */ + if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) + break; + /* This symbol requires a global offset table entry. */ if (dynobj == NULL) @@ -677,7 +682,7 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, /* If this is a local symbol, we resolve it directly without creating a procedure linkage table entry. */ BFD_ASSERT (h != NULL); - if (h->forced_local) + if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT || h->forced_local) break; h->needs_plt = 1; @@ -706,7 +711,9 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, && (!info->symbolic || !h->def_regular))) { - if (h != NULL && !h->forced_local) + if (h != NULL + && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && !h->forced_local) { /* Make sure a plt entry is created for this symbol if it turns out to be a function defined by a dynamic @@ -718,14 +725,17 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, } break; } - if (h != NULL && h->forced_local) + /* If this is a local symbol, we can resolve it directly. */ + if (h != NULL + && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + || h->forced_local)) break; /* Fall through. */ case R_VAX_8: case R_VAX_16: case R_VAX_32: - if (h != NULL) + if (h != NULL && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) { /* Make sure a plt entry is created for this symbol if it turns out to be a function defined by a dynamic object. */ @@ -1465,7 +1475,10 @@ elf_vax_relocate_section (bfd *output_bfd, case R_VAX_GOT32: /* Relocation is to the address of the entry for this symbol in the global offset table. */ - if (h == NULL || h->got.offset == (bfd_vma) -1 || h->forced_local) + if (h == NULL + || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + || h->got.offset == (bfd_vma) -1 + || h->forced_local) break; /* Relocation is the offset of the entry for this symbol in @@ -1527,7 +1540,9 @@ elf_vax_relocate_section (bfd *output_bfd, /* Resolve a PLTxx reloc against a local symbol directly, without using the procedure linkage table. */ - if (h == NULL || h->forced_local) + if (h == NULL + || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + || h->forced_local) break; if (h->plt.offset == (bfd_vma) -1 @@ -1581,7 +1596,9 @@ elf_vax_relocate_section (bfd *output_bfd, case R_VAX_PC8: case R_VAX_PC16: case R_VAX_PC32: - if (h == NULL || h->forced_local) + if (h == NULL + || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + || h->forced_local) break; /* Fall through. */ case R_VAX_8: |