From fde51dd189a1f8a63896bcb845ef36ea5e1917d5 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 4 Dec 2018 06:00:57 -0800 Subject: [PATCH] x86: Don't remove empty GNU_PROPERTY_X86_UINT32_OR_AND properties For GNU_PROPERTY_X86_COMPAT_ISA_1_USED and GNU_PROPERTY_X86_UINT32_OR_AND properties, a bit in the output pr_data field is set if it is set in any relocatable input pr_data fields and this property is present in all relocatable input files. A missing property implies that its bits have unknown values. When all bits in the the output pr_data field are zero, this property should not be removed from output to indicate it has zero in all bits. bfd/ PR ld/23372 * elfxx-x86.c (_bfd_x86_elf_merge_gnu_properties): Don't remove empty properties for GNU_PROPERTY_X86_COMPAT_ISA_1_USED and GNU_PROPERTY_X86_UINT32_OR_AND. (_bfd_x86_elf_link_fixup_gnu_properties): Likewise. ld/ PR ld/23372 * testsuite/ld-i386/pr23372a.d: Updated. * testsuite/ld-i386/pr23372c.d: Likewise. * testsuite/ld-x86-64/pr23372a-x32.d: Likewise. * testsuite/ld-x86-64/pr23372a.d: Likewise. * testsuite/ld-x86-64/pr23372c-x32.d: Likewise. * testsuite/ld-x86-64/pr23372c.d: Likewise. --- bfd/ChangeLog | 8 ++++++++ bfd/elfxx-x86.c | 17 +++++++++++++---- ld/ChangeLog | 10 ++++++++++ ld/testsuite/ld-i386/pr23372a.d | 5 +++++ ld/testsuite/ld-i386/pr23372c.d | 5 +++++ ld/testsuite/ld-x86-64/pr23372a-x32.d | 5 +++++ ld/testsuite/ld-x86-64/pr23372a.d | 5 +++++ ld/testsuite/ld-x86-64/pr23372c-x32.d | 5 +++++ ld/testsuite/ld-x86-64/pr23372c.d | 5 +++++ 9 files changed, 61 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 30616eb7879..618126fffbe 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2018-12-04 H.J. Lu + + PR ld/23372 + * elfxx-x86.c (_bfd_x86_elf_merge_gnu_properties): Don't remove + empty properties for GNU_PROPERTY_X86_COMPAT_ISA_1_USED and + GNU_PROPERTY_X86_UINT32_OR_AND. + (_bfd_x86_elf_link_fixup_gnu_properties): Likewise. + 2018-12-03 Kito Cheng * elfxx-riscv.h (RISCV_DONT_CARE_VERSION): New macro. diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 40aac664f4a..eaa1a82b07a 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -2422,9 +2422,14 @@ _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info, aprop->pr_kind = property_remove; updated = TRUE; } - return updated; } - goto or_property; + else + { + number = aprop->u.number; + aprop->u.number = number | bprop->u.number; + updated = number != (unsigned int) aprop->u.number; + } + return updated; } else if (pr_type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED || (pr_type >= GNU_PROPERTY_X86_UINT32_OR_LO @@ -2432,7 +2437,6 @@ _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info, { if (aprop != NULL && bprop != NULL) { -or_property: number = aprop->u.number; aprop->u.number = number | bprop->u.number; /* Remove the property if all bits are empty. */ @@ -2957,7 +2961,12 @@ _bfd_x86_elf_link_fixup_gnu_properties (struct bfd_link_info *info, || (type >= GNU_PROPERTY_X86_UINT32_OR_AND_LO && type <= GNU_PROPERTY_X86_UINT32_OR_AND_HI)) { - if (p->property.u.number == 0) + if (p->property.u.number == 0 + && (type == GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED + || (type >= GNU_PROPERTY_X86_UINT32_AND_LO + && type <= GNU_PROPERTY_X86_UINT32_AND_HI) + || (type >= GNU_PROPERTY_X86_UINT32_OR_LO + && type <= GNU_PROPERTY_X86_UINT32_OR_HI))) { /* Remove empty property. */ *listp = p->next; diff --git a/ld/ChangeLog b/ld/ChangeLog index 80fd06c1cae..51382253d6c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2018-12-04 H.J. Lu + + PR ld/23372 + * testsuite/ld-i386/pr23372a.d: Updated. + * testsuite/ld-i386/pr23372c.d: Likewise. + * testsuite/ld-x86-64/pr23372a-x32.d: Likewise. + * testsuite/ld-x86-64/pr23372a.d: Likewise. + * testsuite/ld-x86-64/pr23372c-x32.d: Likewise. + * testsuite/ld-x86-64/pr23372c.d: Likewise. + 2018-12-01 H.J. Lu PR ld/23930 diff --git a/ld/testsuite/ld-i386/pr23372a.d b/ld/testsuite/ld-i386/pr23372a.d index b75523bdc38..7af7efb0656 100644 --- a/ld/testsuite/ld-i386/pr23372a.d +++ b/ld/testsuite/ld-i386/pr23372a.d @@ -3,3 +3,8 @@ #as: --32 #ld: -r -m elf_i386 #readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA used: diff --git a/ld/testsuite/ld-i386/pr23372c.d b/ld/testsuite/ld-i386/pr23372c.d index 987ae4cfe54..d5bcc4d7b2b 100644 --- a/ld/testsuite/ld-i386/pr23372c.d +++ b/ld/testsuite/ld-i386/pr23372c.d @@ -3,3 +3,8 @@ #as: --32 #ld: -r -m elf_i386 #readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/pr23372a-x32.d b/ld/testsuite/ld-x86-64/pr23372a-x32.d index 9f936423644..84e46029941 100644 --- a/ld/testsuite/ld-x86-64/pr23372a-x32.d +++ b/ld/testsuite/ld-x86-64/pr23372a-x32.d @@ -3,3 +3,8 @@ #as: --x32 #ld: -r -m elf32_x86_64 #readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/pr23372a.d b/ld/testsuite/ld-x86-64/pr23372a.d index ee688fc2e27..d988a6a4cbf 100644 --- a/ld/testsuite/ld-x86-64/pr23372a.d +++ b/ld/testsuite/ld-x86-64/pr23372a.d @@ -3,3 +3,8 @@ #as: --64 -defsym __64_bit__=1 #ld: -r -m elf_x86_64 #readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/pr23372c-x32.d b/ld/testsuite/ld-x86-64/pr23372c-x32.d index 863f4b7e442..efd6e84aa22 100644 --- a/ld/testsuite/ld-x86-64/pr23372c-x32.d +++ b/ld/testsuite/ld-x86-64/pr23372c-x32.d @@ -3,3 +3,8 @@ #as: --x32 #ld: -r -m elf32_x86_64 #readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA used: diff --git a/ld/testsuite/ld-x86-64/pr23372c.d b/ld/testsuite/ld-x86-64/pr23372c.d index 23bdaa786a7..f56859a014f 100644 --- a/ld/testsuite/ld-x86-64/pr23372c.d +++ b/ld/testsuite/ld-x86-64/pr23372c.d @@ -3,3 +3,8 @@ #as: --64 -defsym __64_bit__=1 #ld: -r -m elf_x86_64 #readelf: -n + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: x86 ISA used: -- 2.30.2