diff options
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf-properties.c | 90 | ||||
-rw-r--r-- | binutils/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/readelf.c | 15 | ||||
-rw-r--r-- | include/ChangeLog | 7 | ||||
-rw-r--r-- | include/elf/common.h | 10 | ||||
-rw-r--r-- | ld/ChangeLog | 19 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-and-1.d | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-and-1.s | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-and-2.d | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-and-2.s | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-and-3.d | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-and-3.s | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-and-4.d | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-and-empty.s | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-or-1.d | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-or-1.s | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-or-2.d | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-or-2.s | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-or-3.d | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-or-3.s | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-or-4.d | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/property-or-empty.s | 15 |
23 files changed, 353 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ad63f9c..29e41a3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2021-06-18 H.J. Lu <hongjiu.lu@intel.com> + + * elf-properties.c (_bfd_elf_parse_gnu_properties): Handle + GNU_PROPERTY_UINT32_AND_LO, GNU_PROPERTY_UINT32_AND_HI, + GNU_PROPERTY_UINT32_OR_LO and GNU_PROPERTY_UINT32_OR_HI. + (elf_merge_gnu_properties): Likewise. + 2021-06-11 Alan Modra <amodra@gmail.com> PR 27952 diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c index 25b9a40..56ee91d 100644 --- a/bfd/elf-properties.c +++ b/bfd/elf-properties.c @@ -178,6 +178,25 @@ _bfd_elf_parse_gnu_properties (bfd *abfd, Elf_Internal_Note *note) goto next; default: + if ((type >= GNU_PROPERTY_UINT32_AND_LO + && type <= GNU_PROPERTY_UINT32_AND_HI) + || (type >= GNU_PROPERTY_UINT32_OR_LO + && type <= GNU_PROPERTY_UINT32_OR_HI)) + { + if (datasz != 4) + { + _bfd_error_handler + (_("error: %pB: <corrupt property (0x%x) size: 0x%x>"), + abfd, type, datasz); + /* Clear all properties. */ + elf_properties (abfd) = NULL; + return false; + } + prop = _bfd_elf_get_property (abfd, type, datasz); + prop->u.number |= bfd_h_get_32 (abfd, ptr); + prop->pr_kind = property_number; + goto next; + } break; } } @@ -203,6 +222,8 @@ elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd, bfd *bbfd, { const struct elf_backend_data *bed = get_elf_backend_data (abfd); unsigned int pr_type = aprop != NULL ? aprop->pr_type : bprop->pr_type; + unsigned int number; + bool updated; if (bed->merge_gnu_properties != NULL && pr_type >= GNU_PROPERTY_LOPROC @@ -229,6 +250,75 @@ elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd, bfd *bbfd, return aprop == NULL; default: + updated = false; + if (pr_type >= GNU_PROPERTY_UINT32_OR_LO + && pr_type <= GNU_PROPERTY_UINT32_OR_HI) + { + if (aprop != NULL && bprop != NULL) + { + number = aprop->u.number; + aprop->u.number = number | bprop->u.number; + /* Remove the property if all bits are empty. */ + if (aprop->u.number == 0) + { + aprop->pr_kind = property_remove; + updated = true; + } + else + updated = number != (unsigned int) aprop->u.number; + } + else + { + /* Only one of APROP and BPROP can be NULL. */ + if (aprop != NULL) + { + if (aprop->u.number == 0) + { + /* Remove APROP if all bits are empty. */ + aprop->pr_kind = property_remove; + updated = true; + } + } + else + { + /* Return TRUE if APROP is NULL and all bits of BPROP + aren't empty to indicate that BPROP should be added + to ABFD. */ + updated = bprop->u.number != 0; + } + } + return updated; + } + else if (pr_type >= GNU_PROPERTY_UINT32_AND_LO + && pr_type <= GNU_PROPERTY_UINT32_AND_HI) + { + /* Only one of APROP and BPROP can be NULL: + 1. APROP & BPROP when both APROP and BPROP aren't NULL. + 2. If APROP is NULL, remove x86 feature. + 3. Otherwise, do nothing. + */ + if (aprop != NULL && bprop != NULL) + { + number = aprop->u.number; + aprop->u.number = number & bprop->u.number; + updated = number != (unsigned int) aprop->u.number; + /* Remove the property if all feature bits are cleared. */ + if (aprop->u.number == 0) + aprop->pr_kind = property_remove; + } + else + { + /* There should be no AND properties since some input + doesn't have them. */ + if (aprop != NULL) + { + aprop->pr_kind = property_remove; + updated = true; + } + } + return updated; + } + /* Never should happen. */ abort (); } diff --git a/binutils/ChangeLog b/binutils/ChangeLog index af73112..125dd2e 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2021-06-18 H.J. Lu <hongjiu.lu@intel.com> + + * readelf.c (print_gnu_property_note): Handle + GNU_PROPERTY_UINT32_AND_LO, GNU_PROPERTY_UINT32_AND_HI, + GNU_PROPERTY_UINT32_OR_LO and GNU_PROPERTY_UINT32_OR_HI. + 2021-06-15 Nick Clifton <nickc@redhat.com> * readelf.c (get_note_type): Add support for NT_GO_BUILDID. diff --git a/binutils/readelf.c b/binutils/readelf.c index 20100f1..f7c6432 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -19507,6 +19507,21 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote) goto next; default: + if ((type >= GNU_PROPERTY_UINT32_AND_LO + && type <= GNU_PROPERTY_UINT32_AND_HI) + || (type >= GNU_PROPERTY_UINT32_OR_LO + && type <= GNU_PROPERTY_UINT32_OR_HI)) + { + if (type <= GNU_PROPERTY_UINT32_AND_HI) + printf (_("UINT32_AND (%#x): "), type); + else + printf (_("UINT32_OR (%#x): "), type); + if (datasz != 4) + printf (_("<corrupt length: %#x> "), datasz); + else + printf ("%#x", (unsigned int) byte_get (ptr, 4)); + goto next; + } break; } } diff --git a/include/ChangeLog b/include/ChangeLog index b6bf28a..2a5b16f 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,10 @@ +2021-06-18 H.J. Lu <hongjiu.lu@intel.com> + + * elf/common.h (GNU_PROPERTY_UINT32_AND_LO): New. + (GNU_PROPERTY_UINT32_AND_HI): Likewise. + (GNU_PROPERTY_UINT32_OR_LO): Likewise. + (GNU_PROPERTY_UINT32_OR_HI): Likewise. + 2021-06-15 Nick Clifton <nickc@redhat.com> * elf/common.h (NT_GO_BUILDID): Define. diff --git a/include/elf/common.h b/include/elf/common.h index 58b0936..0cca286 100644 --- a/include/elf/common.h +++ b/include/elf/common.h @@ -782,6 +782,16 @@ #define GNU_PROPERTY_STACK_SIZE 1 #define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 +/* A 4-byte unsigned integer property: A bit is set if it is set in all + relocatable inputs. */ +#define GNU_PROPERTY_UINT32_AND_LO 0xb0000000 +#define GNU_PROPERTY_UINT32_AND_HI 0xb0007fff + +/* A 4-byte unsigned integer property: A bit is set if it is set in any + relocatable inputs. */ +#define GNU_PROPERTY_UINT32_OR_LO 0xb0008000 +#define GNU_PROPERTY_UINT32_OR_HI 0xb000ffff + /* Processor-specific semantics, lo */ #define GNU_PROPERTY_LOPROC 0xc0000000 /* Processor-specific semantics, hi */ diff --git a/ld/ChangeLog b/ld/ChangeLog index 37a373b..27434d6 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,22 @@ +2021-06-18 H.J. Lu <hongjiu.lu@intel.com> + + * testsuite/ld-elf/property-and-1.d: New file. + * testsuite/ld-elf/property-and-1.s: Likewise. + * testsuite/ld-elf/property-and-2.d: Likewise. + * testsuite/ld-elf/property-and-2.s: Likewise. + * testsuite/ld-elf/property-and-3.d: Likewise. + * testsuite/ld-elf/property-and-3.s: Likewise. + * testsuite/ld-elf/property-and-4.d: Likewise. + * testsuite/ld-elf/property-and-empty.s: Likewise. + * testsuite/ld-elf/property-or-1.d: Likewise. + * testsuite/ld-elf/property-or-1.s: Likewise. + * testsuite/ld-elf/property-or-2.d: Likewise. + * testsuite/ld-elf/property-or-2.s: Likewise. + * testsuite/ld-elf/property-or-3.d: Likewise. + * testsuite/ld-elf/property-or-3.s: Likewise. + * testsuite/ld-elf/property-or-4.d: Likewise. + * testsuite/ld-elf/property-or-empty.s: Likewise. + 2021-06-17 H.J. Lu <hongjiu.lu@intel.com> PR ld/27973 diff --git a/ld/testsuite/ld-elf/property-and-1.d b/ld/testsuite/ld-elf/property-and-1.d new file mode 100644 index 0000000..480d16e --- /dev/null +++ b/ld/testsuite/ld-elf/property-and-1.d @@ -0,0 +1,6 @@ +#source: empty.s +#source: property-and-1.s +#as: +#ld: -shared +#readelf: -n +#xfail: ![check_shared_lib_support] diff --git a/ld/testsuite/ld-elf/property-and-1.s b/ld/testsuite/ld-elf/property-and-1.s new file mode 100644 index 0000000..3cff33d --- /dev/null +++ b/ld/testsuite/ld-elf/property-and-1.s @@ -0,0 +1,15 @@ + .section ".note.gnu.property", "a" + .p2align ALIGN + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align ALIGN +2: .long 0xb0007fff /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x3 +4: + .p2align ALIGN +5: diff --git a/ld/testsuite/ld-elf/property-and-2.d b/ld/testsuite/ld-elf/property-and-2.d new file mode 100644 index 0000000..007ba48 --- /dev/null +++ b/ld/testsuite/ld-elf/property-and-2.d @@ -0,0 +1,7 @@ +#source: property-and-1.s +#source: empty.s +#source: property-and-2.s +#as: +#ld: -shared +#readelf: -n +#xfail: ![check_shared_lib_support] diff --git a/ld/testsuite/ld-elf/property-and-2.s b/ld/testsuite/ld-elf/property-and-2.s new file mode 100644 index 0000000..7149cb2 --- /dev/null +++ b/ld/testsuite/ld-elf/property-and-2.s @@ -0,0 +1,15 @@ + .section ".note.gnu.property", "a" + .p2align ALIGN + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align ALIGN +2: .long 0xb0007fff /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x101 +4: + .p2align ALIGN +5: diff --git a/ld/testsuite/ld-elf/property-and-3.d b/ld/testsuite/ld-elf/property-and-3.d new file mode 100644 index 0000000..8d5e579 --- /dev/null +++ b/ld/testsuite/ld-elf/property-and-3.d @@ -0,0 +1,7 @@ +#source: property-and-1.s +#source: property-and-empty.s +#source: property-and-2.s +#as: +#ld: -shared +#readelf: -n +#xfail: ![check_shared_lib_support] diff --git a/ld/testsuite/ld-elf/property-and-3.s b/ld/testsuite/ld-elf/property-and-3.s new file mode 100644 index 0000000..2838c9a --- /dev/null +++ b/ld/testsuite/ld-elf/property-and-3.s @@ -0,0 +1,15 @@ + .section ".note.gnu.property", "a" + .p2align ALIGN + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align ALIGN +2: .long 0xb0007fff /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x1001 +4: + .p2align ALIGN +5: diff --git a/ld/testsuite/ld-elf/property-and-4.d b/ld/testsuite/ld-elf/property-and-4.d new file mode 100644 index 0000000..84bf404 --- /dev/null +++ b/ld/testsuite/ld-elf/property-and-4.d @@ -0,0 +1,12 @@ +#source: property-and-1.s +#source: property-and-2.s +#source: property-and-3.s +#as: +#ld: -shared +#readelf: -n +#xfail: ![check_shared_lib_support] + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: UINT32_AND \(0xb0007fff\): 0x1 diff --git a/ld/testsuite/ld-elf/property-and-empty.s b/ld/testsuite/ld-elf/property-and-empty.s new file mode 100644 index 0000000..02669ad --- /dev/null +++ b/ld/testsuite/ld-elf/property-and-empty.s @@ -0,0 +1,15 @@ + .section ".note.gnu.property", "a" + .p2align ALIGN + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align ALIGN +2: .long 0xb0007fff /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x0 +4: + .p2align ALIGN +5: diff --git a/ld/testsuite/ld-elf/property-or-1.d b/ld/testsuite/ld-elf/property-or-1.d new file mode 100644 index 0000000..f5392c4 --- /dev/null +++ b/ld/testsuite/ld-elf/property-or-1.d @@ -0,0 +1,11 @@ +#source: empty.s +#source: property-or-1.s +#as: +#ld: -shared +#readelf: -n +#xfail: ![check_shared_lib_support] + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: UINT32_OR \(0xb000ffff\): 0x3 diff --git a/ld/testsuite/ld-elf/property-or-1.s b/ld/testsuite/ld-elf/property-or-1.s new file mode 100644 index 0000000..a471418 --- /dev/null +++ b/ld/testsuite/ld-elf/property-or-1.s @@ -0,0 +1,15 @@ + .section ".note.gnu.property", "a" + .p2align ALIGN + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align ALIGN +2: .long 0xb000ffff /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x3 +4: + .p2align ALIGN +5: diff --git a/ld/testsuite/ld-elf/property-or-2.d b/ld/testsuite/ld-elf/property-or-2.d new file mode 100644 index 0000000..85b7548 --- /dev/null +++ b/ld/testsuite/ld-elf/property-or-2.d @@ -0,0 +1,12 @@ +#source: property-or-1.s +#source: empty.s +#source: property-or-2.s +#as: +#ld: -shared +#readelf: -n +#xfail: ![check_shared_lib_support] + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: UINT32_OR \(0xb000ffff\): 0x103 diff --git a/ld/testsuite/ld-elf/property-or-2.s b/ld/testsuite/ld-elf/property-or-2.s new file mode 100644 index 0000000..a26047d --- /dev/null +++ b/ld/testsuite/ld-elf/property-or-2.s @@ -0,0 +1,15 @@ + .section ".note.gnu.property", "a" + .p2align ALIGN + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align ALIGN +2: .long 0xb000ffff /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x101 +4: + .p2align ALIGN +5: diff --git a/ld/testsuite/ld-elf/property-or-3.d b/ld/testsuite/ld-elf/property-or-3.d new file mode 100644 index 0000000..2d687db --- /dev/null +++ b/ld/testsuite/ld-elf/property-or-3.d @@ -0,0 +1,12 @@ +#source: property-or-1.s +#source: property-and-empty.s +#source: property-or-2.s +#as: +#ld: -shared +#readelf: -n +#xfail: ![check_shared_lib_support] + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: UINT32_OR \(0xb000ffff\): 0x103 diff --git a/ld/testsuite/ld-elf/property-or-3.s b/ld/testsuite/ld-elf/property-or-3.s new file mode 100644 index 0000000..d3e7367 --- /dev/null +++ b/ld/testsuite/ld-elf/property-or-3.s @@ -0,0 +1,15 @@ + .section ".note.gnu.property", "a" + .p2align ALIGN + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align ALIGN +2: .long 0xb000ffff /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x1001 +4: + .p2align ALIGN +5: diff --git a/ld/testsuite/ld-elf/property-or-4.d b/ld/testsuite/ld-elf/property-or-4.d new file mode 100644 index 0000000..fee22b1 --- /dev/null +++ b/ld/testsuite/ld-elf/property-or-4.d @@ -0,0 +1,12 @@ +#source: property-or-1.s +#source: property-or-2.s +#source: property-or-3.s +#as: +#ld: -shared +#readelf: -n +#xfail: ![check_shared_lib_support] + +Displaying notes found in: .note.gnu.property +[ ]+Owner[ ]+Data size[ ]+Description + GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 + Properties: UINT32_OR \(0xb000ffff\): 0x1103 diff --git a/ld/testsuite/ld-elf/property-or-empty.s b/ld/testsuite/ld-elf/property-or-empty.s new file mode 100644 index 0000000..f37e1dc --- /dev/null +++ b/ld/testsuite/ld-elf/property-or-empty.s @@ -0,0 +1,15 @@ + .section ".note.gnu.property", "a" + .p2align ALIGN + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align ALIGN +2: .long 0xb000ffff /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x0 +4: + .p2align ALIGN +5: |