]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
GNU attribute output on errors
authorAlan Modra <amodra@gmail.com>
Tue, 3 Jul 2018 05:20:38 +0000 (14:50 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 5 Jul 2018 12:48:55 +0000 (22:18 +0930)
commitbdb5f07bd57f3680c3152d02e2f552366b25d93f
tree6b47dad56a3a46b70844026db13dcc94d2262877
parentf4b933ddc030373b5303e20b8cdd6d4f31c85b38
GNU attribute output on errors

.gnu.attributes entries from linker input files are merged to the
output file, the output having the union of compatible input
attributes.  Incompatible attributes generally cause a linker error
and no output.  However in some cases only a warning is emitted, and
one of the incompatible input attributes is passed on to the output.

PowerPC tends to emit warnings rather than errors, and the output
takes the first input attribute.  For example, if we have two input
files with Tag_GNU_Power_ABI_FP, the first with a value signifying
"double-precision hard float, IBM long double", the second with a
value signifying "double-precision hard float, IEEE long double",
we'll get a warning about incompatible long double types and the
output will say "double-precision hard float, IBM long double".
The output attribute of course isn't correct.  It would be correct to
specify "IBM and IEEE long double", but we don't have a way to
represent that currently.  While it would be possible to extend the
encoding, there isn't much gain in doing so.  A shared library
providing support for both long double types should link against
objects using either long double type without warning or error.  That
is what you'd get if such a shared library had no Tag_GNU_Power_ABI_FP
attribute.

So this patch provides a way for the backend to omit .gnu.attributes
tags from the output.

* elf-bfd.h (ATTR_TYPE_FLAG_ERROR, ATTR_TYPE_HAS_ERROR): Define.
* elf-attrs.c (is_default_attr): Handle ATTR_TYPE_HAS_ERROR.
* elf32-ppc.c (_bfd_elf_ppc_merge_fp_attributes): Use
ATTR_TYPE_FLAG_INT_VAL.  Set ATTR_TYPE_HAS_ERROR on finding
incompatible attribute.
(ppc_elf_merge_obj_attributes): Likewise.  Return
_bfd_elf_merge_object_attributes result.
* elf64-ppc.c (ppc64_elf_merge_private_bfd_data): Return
_bfd_elf_merge_object_attributes result.

(cherry picked from commit 8d2c8c3d17926826864f4b739362f66af547428f)
bfd/ChangeLog
bfd/elf-attrs.c
bfd/elf-bfd.h
bfd/elf32-ppc.c
bfd/elf64-ppc.c