aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf-properties.c90
-rw-r--r--binutils/ChangeLog6
-rw-r--r--binutils/readelf.c15
-rw-r--r--include/ChangeLog7
-rw-r--r--include/elf/common.h10
-rw-r--r--ld/ChangeLog19
-rw-r--r--ld/testsuite/ld-elf/property-and-1.d6
-rw-r--r--ld/testsuite/ld-elf/property-and-1.s15
-rw-r--r--ld/testsuite/ld-elf/property-and-2.d7
-rw-r--r--ld/testsuite/ld-elf/property-and-2.s15
-rw-r--r--ld/testsuite/ld-elf/property-and-3.d7
-rw-r--r--ld/testsuite/ld-elf/property-and-3.s15
-rw-r--r--ld/testsuite/ld-elf/property-and-4.d12
-rw-r--r--ld/testsuite/ld-elf/property-and-empty.s15
-rw-r--r--ld/testsuite/ld-elf/property-or-1.d11
-rw-r--r--ld/testsuite/ld-elf/property-or-1.s15
-rw-r--r--ld/testsuite/ld-elf/property-or-2.d12
-rw-r--r--ld/testsuite/ld-elf/property-or-2.s15
-rw-r--r--ld/testsuite/ld-elf/property-or-3.d12
-rw-r--r--ld/testsuite/ld-elf/property-or-3.s15
-rw-r--r--ld/testsuite/ld-elf/property-or-4.d12
-rw-r--r--ld/testsuite/ld-elf/property-or-empty.s15
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: