diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elfxx-x86.c | 17 |
2 files changed, 21 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 30616eb..618126f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2018-12-04 H.J. Lu <hongjiu.lu@intel.com> + + 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 <kito@andestech.com> * elfxx-riscv.h (RISCV_DONT_CARE_VERSION): New macro. diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 40aac66..eaa1a82 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; |