if (prop.pr_type == GNU_PROPERTY_STACK_SIZE)
{
printf ("STACK_SIZE ");
- if (prop.pr_datasz == 4 || prop.pr_datasz == 8)
+ union
+ {
+ Elf64_Addr a64;
+ Elf32_Addr a32;
+ } addr;
+ if ((elfclass == ELFCLASS32 && prop.pr_datasz == 4)
+ || (elfclass == ELFCLASS64 && prop.pr_datasz == 8))
{
- GElf_Addr addr;
in.d_type = ELF_T_ADDR;
out.d_type = ELF_T_ADDR;
in.d_size = prop.pr_datasz;
- out.d_size = sizeof (addr);
+ out.d_size = prop.pr_datasz;
in.d_buf = (void *) desc;
- out.d_buf = (void *) &addr;
+ out.d_buf = (elfclass == ELFCLASS32
+ ? (void *) &addr.a32
+ : (void *) &addr.a64);
if (gelf_xlatetom (ebl->elf, &out, &in,
elfident[EI_DATA]) == NULL)
printf ("%s\n", elf_errmsg (-1));
return;
}
- printf ("%#" PRIx64 "\n", addr);
+ if (elfclass == ELFCLASS32)
+ printf ("%#" PRIx32 "\n", addr.a32);
+ else
+ printf ("%#" PRIx64 "\n", addr.a64);
}
else
printf (" (garbage datasz: %" PRIx32 ")\n",
+2018-12-02 Mark Wielaard <mark@klomp.org>
+
+ * testfile_gnu_props.32le.o.bz2: New testfile.
+ * testfile_gnu_props.64le.o.bz2: Likewise.
+ * testfile_gnu_props.32be.o.bz2: Likewise.
+ * testfile_gnu_props.64be.o.bz2: Likewise.
+ * Makefile (EXTRA_DIST): Add new testfiles.
+ * run-readelf-n.sh: Run tests on new testfiles.
+
2018-11-28 Mark Wielaard <mark@klomp.org>
* backtrace-data.c (main): Improve error message.
X86 0xc0000000 data: 00 00 00 00
X86 0xc0000001 data: 00 00 00 00
EOF
+
+#
+# = gnu_props.S
+#
+# #define NT_GNU_PROPERTY_TYPE_0 5
+# #define GNU_PROPERTY_STACK_SIZE 1
+# #define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2
+
+# /* Normal notes always have alignment and padding of 4 bytes,
+# but GNU Property notes use 4 byte words, with 8 byte padding
+# for ELFCLASS64. */
+# #if __SIZEOF_PTRDIFF_T__ == 8
+# # define ALIGN 3
+# #elif __SIZEOF_PTRDIFF_T__ == 4
+# # define ALIGN 2
+# #endif
+#
+# .section ".note.gnu.property", "a"
+# .p2align ALIGN
+# /* First note. */
+# .long 1f - 0f /* name length. */
+# .long 4f - 2f /* data length. */
+# .long NT_GNU_PROPERTY_TYPE_0 /* note type. */
+# 0:
+# .asciz "GNU" /* vendor name. */
+# 1:
+# .p2align ALIGN /* Padding. */
+# 2:
+# .long GNU_PROPERTY_STACK_SIZE /* pr_type. */
+# .long 4f - 3f /* pr_datasz. */
+# 3:
+# .dc.a 0x280000 /* Stack size. */
+# 4:
+# .p2align ALIGN
+#
+# /* Second note. */
+# .long 6f - 5f /* name length. */
+# .long 8f - 7f /* data length. */
+# .long NT_GNU_PROPERTY_TYPE_0 /* note type. */
+# 5:
+# .asciz "GNU" /* vendor name. */
+# 6:
+# .p2align ALIGN /* Padding. */
+# 7:
+# .long GNU_PROPERTY_NO_COPY_ON_PROTECTED /* pr_type. */
+# .long 0 /* pr_datasz. */
+# /* No data. */
+# 8:
+# .p2align ALIGN
+#
+# On x86_64
+# gcc -m64 -c -o testfile_gnu_props_64le.o gnu_props.S
+# gcc -m32 -c -o testfile_gnu_props_32le.o gnu_props.S
+
+testfiles testfile_gnu_props.32le.o testfile_gnu_props.64le.o
+
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile_gnu_props.32le.o << EOF
+
+Note section [ 4] '.note.gnu.property' of 52 bytes at offset 0x34:
+ Owner Data size Type
+ GNU 12 GNU_PROPERTY_TYPE_0
+ STACK_SIZE 0x280000
+ GNU 8 GNU_PROPERTY_TYPE_0
+ NO_COPY_ON_PROTECTION
+EOF
+
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile_gnu_props.64le.o << EOF
+
+Note section [ 4] '.note.gnu.property' of 56 bytes at offset 0x40:
+ Owner Data size Type
+ GNU 16 GNU_PROPERTY_TYPE_0
+ STACK_SIZE 0x280000
+ GNU 8 GNU_PROPERTY_TYPE_0
+ NO_COPY_ON_PROTECTION
+EOF
+
+# On ppc64
+# gcc -m32 -c -o testfile_gnu_props.32be.o gnu_props.S
+# gcc -m64 -c -o testfile_gnu_props.64be.o gnu_props.S
+
+testfiles testfile_gnu_props.32be.o testfile_gnu_props.64be.o
+
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile_gnu_props.32be.o << EOF
+
+Note section [ 4] '.note.gnu.property' of 52 bytes at offset 0x34:
+ Owner Data size Type
+ GNU 12 GNU_PROPERTY_TYPE_0
+ STACK_SIZE 0x280000
+ GNU 8 GNU_PROPERTY_TYPE_0
+ NO_COPY_ON_PROTECTION
+EOF
+
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile_gnu_props.64be.o << EOF
+
+Note section [ 4] '.note.gnu.property' of 56 bytes at offset 0x40:
+ Owner Data size Type
+ GNU 16 GNU_PROPERTY_TYPE_0
+ STACK_SIZE 0x280000
+ GNU 8 GNU_PROPERTY_TYPE_0
+ NO_COPY_ON_PROTECTION
+EOF