A patch for visibility.
H . J . Lu
hjl@valinux.com
Mon May 22 16:33:00 GMT 2000
On Mon, May 22, 2000 at 01:20:21PM -0700, Ulrich Drepper wrote:
> Martin von Loewis <loewis@informatik.hu-berlin.de> writes:
>
> > The ABI says
>
> Martin, you can stop arguing. Visibility on undefined references make
> no sense. Both HJ and I were there when this extension was designed
> and decided. And just to be sure we asked today for clarification.
> Any future comment is just noise. The patch seems to do the right
> thing and the intent is to not have any of the bits set for undefined
> references.
>
This patch implements undefined symbols with the non-default
visibility attributes for ia32. I will add it to others if it is
ok with everyone. However, weak undefined symbols with hidden and
internal only work with the current glibc 2.2. I will send a patch
for glibc 2.1 later.
H.J.
--
H.J. Lu (hjl@gnu.org)
---
2000-05-22 H.J. Lu <hjl@gnu.org>
* elf32-i386.c (elf_i386_relocate_section): Don't allow the
undefined symbol with the non-default visibility attributes.
* elflink.c (_bfd_elf_link_record_dynamic_symbol): Correctly
handle weak undefined symbols with hidden and internal
attributes.
* elflink.h (elf_link_output_extsym): Clear the visibility
attributes and the ELF_LINK_FORCED_LOCAL bit for symbols
not locally defined.
Index: elf32-i386.c
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/elf32-i386.c,v
retrieving revision 1.13
diff -u -p -r1.13 elf32-i386.c
--- elf32-i386.c 2000/05/02 17:23:17 1.13
+++ elf32-i386.c 2000/05/22 21:26:04
@@ -1390,14 +1390,17 @@ elf_i386_relocate_section (output_bfd, i
}
else if (h->root.type == bfd_link_hash_undefweak)
relocation = 0;
- else if (info->shared && !info->symbolic && !info->no_undefined)
+ else if (info->shared && !info->symbolic
+ && !info->no_undefined
+ && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
relocation = 0;
else
{
if (! ((*info->callbacks->undefined_symbol)
(info, h->root.root.string, input_bfd,
input_section, rel->r_offset,
- (!info->shared || info->no_undefined))))
+ (!info->shared || info->no_undefined
+ || ELF_ST_VISIBILITY (h->other)))))
return false;
relocation = 0;
}
Index: elflink.c
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/elflink.c,v
retrieving revision 1.3
diff -u -p -r1.3 elflink.c
--- elflink.c 2000/05/02 17:23:17 1.3
+++ elflink.c 2000/05/22 23:11:14
@@ -235,10 +235,17 @@ _bfd_elf_link_record_dynamic_symbol (inf
(*info->callbacks->undefined_symbol)
(info, name, abfd, bfd_und_section_ptr, 0, true);
+
+ /* We have flaged a fatal error. We now treat this as
+ a normal symbol to avoid further error messages. */
+ h->other ^= ELF_ST_VISIBILITY (h->other);
}
-
- h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
- return true;
+ else
+ {
+ h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL;
+ if (h->root.type != bfd_link_hash_undefweak)
+ return true;
+ }
default:
break;
Index: elflink.h
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/elflink.h,v
retrieving revision 1.28
diff -u -p -r1.28 elflink.h
--- elflink.h 2000/05/22 16:24:25 1.28
+++ elflink.h 2000/05/22 22:53:10
@@ -4895,6 +4895,15 @@ elf_link_output_extsym (h, data)
Elf_Internal_Sym sym;
asection *input_sec;
+ /* If a symbol is not defined locally, we clear the visibility
+ field and the ELF_LINK_FORCED_LOCAL bit. */
+ if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
+ && ELF_ST_VISIBILITY(h->other))
+ {
+ h->elf_link_hash_flags &= ~ELF_LINK_FORCED_LOCAL;
+ h->other ^= ELF_ST_VISIBILITY(h->other);
+ }
+
/* Decide whether to output this symbol in this pass. */
if (eoinfo->localsyms)
{
@@ -5088,11 +5097,6 @@ elf_link_output_extsym (h, data)
bindtype = STB_WEAK;
sym.st_info = ELF_ST_INFO (bindtype, ELF_ST_TYPE (sym.st_info));
}
-
- /* If a symbol is not defined locally, we clear the visibility
- field. */
- if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
- sym.st_other ^= ELF_ST_VISIBILITY(sym.st_other);
/* If this symbol should be put in the .dynsym section, then put it
there now. We have already know the symbol index. We also fill
More information about the Binutils
mailing list