aboutsummaryrefslogtreecommitdiff
path: root/binutils/readelf.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2021-06-17 12:35:18 -0700
committerH.J. Lu <hjl.tools@gmail.com>2021-07-08 18:11:53 -0700
commit6320fd00dc374f74658c7e4b7dffbe1d71723284 (patch)
tree95d9ca4603d3b066d511280d66ee384062c52853 /binutils/readelf.c
parentce8fea3651a6050d5089b6d90068733f4cb9f686 (diff)
downloadgdb-6320fd00dc374f74658c7e4b7dffbe1d71723284.zip
gdb-6320fd00dc374f74658c7e4b7dffbe1d71723284.tar.gz
gdb-6320fd00dc374f74658c7e4b7dffbe1d71723284.tar.bz2
elf: Add GNU_PROPERTY_1_NEEDED
Add GNU_PROPERTY_1_NEEDED: #define GNU_PROPERTY_1_NEEDED GNU_PROPERTY_UINT32_OR_LO to indicate the needed properties by the object file. Add GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS: #define GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (1U << 0) to indicate that the object file requires canonical function pointers and cannot be used with copy relocation. binutils/ * readelf.c (decode_1_needed): New. (print_gnu_property_note): Handle GNU_PROPERTY_1_NEEDED. include/ * elf/common.h (GNU_PROPERTY_1_NEEDED): New. (GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS): Likewise. ld/ * testsuite/ld-elf/property-1_needed-1a.d: New file. * testsuite/ld-elf/property-1_needed-1.s: Likewise.
Diffstat (limited to 'binutils/readelf.c')
-rw-r--r--binutils/readelf.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 2215339..24ff069 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -19333,6 +19333,28 @@ decode_aarch64_feature_1_and (unsigned int bitmask)
}
static void
+decode_1_needed (unsigned int bitmask)
+{
+ while (bitmask)
+ {
+ unsigned int bit = bitmask & (- bitmask);
+
+ bitmask &= ~ bit;
+ switch (bit)
+ {
+ case GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS:
+ printf ("indirect external access");
+ break;
+ default:
+ printf (_("<unknown: %x>"), bit);
+ break;
+ }
+ if (bitmask)
+ printf (", ");
+ }
+}
+
+static void
print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
{
unsigned char * ptr = (unsigned char *) pnote->descdata;
@@ -19525,6 +19547,23 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
|| (type >= GNU_PROPERTY_UINT32_OR_LO
&& type <= GNU_PROPERTY_UINT32_OR_HI))
{
+ switch (type)
+ {
+ case GNU_PROPERTY_1_NEEDED:
+ if (datasz != 4)
+ printf (_("1_needed: <corrupt length: %#x> "),
+ datasz);
+ else
+ {
+ unsigned int bitmask = byte_get (ptr, 4);
+ printf ("1_needed: ");
+ decode_1_needed (bitmask);
+ }
+ goto next;
+
+ default:
+ break;
+ }
if (type <= GNU_PROPERTY_UINT32_AND_HI)
printf (_("UINT32_AND (%#x): "), type);
else