[LV] [PATCH] VAX/ELF: Symbol visibility support
Maciej W. Rozycki
macro at linux-mips.org
Fri Jun 5 02:09:32 CEST 2009
Hello,
This is a patch to add symbol visibility support to the VAX/ELF backend.
Changes include attribute recognition in BFD so that GOT or PLT entries
are not created as expected (unlimited PC-relative addressing is supported
by VAX for all kinds of memory references, so there is no need for
run-time relocation of local symbols) as well as a fix to GAS so as to
permit indirect symbol references which inevitably will be generated for
some hidden symbols by GCC. Any errors resulting from the inability to
route indirect references via the GOT -- which may happen for handcoded
assembly only -- are already reported by the linker as they should be.
Regression-tested successfully with the vax-linux target; running
dynamically-linked `bash' on the target system (about the best native
testing possible atm) revealed no problems either.
bfd/
2009-06-04 Maciej W. Rozycki <macro at linux-mips.org>
* elf32-vax.c (elf_vax_check_relocs): Handle the visibility
attribute.
(elf_vax_relocate_section): Likewise.
gas/
2009-06-04 Maciej W. Rozycki <macro at linux-mips.org>
* config/tc-vax.c (md_estimate_size_before_relax): Accept
indirect symbol references in the PIC mode and emit a
PC-relative relocation instead of a GOT/PLT one. Likewise
for symbols known to be hidden at this point.
OK to apply?
Maciej
binutils-2.19.51-20090531-vax-elf-visibility.patch
diff -up --recursive --new-file binutils-2.19.51-20090531.macro/bfd/elf32-vax.c binutils-2.19.51-20090531/bfd/elf32-vax.c
--- binutils-2.19.51-20090531.macro/bfd/elf32-vax.c 2009-04-02 04:25:18.000000000 +0000
+++ binutils-2.19.51-20090531/bfd/elf32-vax.c 2009-06-01 23:23:15.000000000 +0000
@@ -605,6 +605,11 @@ elf_vax_check_relocs (bfd *abfd, struct
|| 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
/* 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
&& (!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
}
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_bf
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_bf
/* 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_bf
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:
diff -up --recursive --new-file binutils-2.19.51-20090531.macro/gas/config/tc-vax.c binutils-2.19.51-20090531/gas/config/tc-vax.c
--- binutils-2.19.51-20090531.macro/gas/config/tc-vax.c 2009-04-02 04:25:28.000000000 +0000
+++ binutils-2.19.51-20090531/gas/config/tc-vax.c 2009-06-01 23:23:15.000000000 +0000
@@ -396,23 +396,20 @@ md_estimate_size_before_relax (fragS *fr
|| S_IS_WEAK (fragP->fr_symbol)
|| S_IS_EXTERNAL (fragP->fr_symbol)))
{
- if (p[0] & 0x10)
- {
- if (flag_want_pic)
- as_fatal ("PIC reference to %s is indirect.\n",
- S_GET_NAME (fragP->fr_symbol));
- }
+ /* Indirect references cannot go through the GOT or PLT,
+ let's hope they'll become local in the final link. */
+ if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol))
+ != STV_DEFAULT)
+ || (p[0] & 0x10))
+ reloc_type = BFD_RELOC_32_PCREL;
+ else if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS
+ || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG
+ || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB
+ || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP
+ || S_IS_FUNCTION (fragP->fr_symbol))
+ reloc_type = BFD_RELOC_32_PLT_PCREL;
else
- {
- if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS
- || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG
- || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB
- || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP
- || S_IS_FUNCTION (fragP->fr_symbol))
- reloc_type = BFD_RELOC_32_PLT_PCREL;
- else
- reloc_type = BFD_RELOC_32_GOT_PCREL;
- }
+ reloc_type = BFD_RELOC_32_GOT_PCREL;
}
#endif
switch (RELAX_STATE (fragP->fr_subtype))
_______________________________________________
Linux-Vax mailing list
Linux-Vax at mail.pergamentum.com
http://mail.pergamentum.com/mailman/listinfo/linux-vax
More information about the Vax-linux
mailing list