]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
tests: Add testcase for elf_getphdrnum with more than 65535 entries.
authorMark Wielaard <mark@klomp.org>
Sun, 22 Mar 2020 22:14:24 +0000 (23:14 +0100)
committerMark Wielaard <mark@klomp.org>
Mon, 23 Mar 2020 11:28:50 +0000 (12:28 +0100)
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Omar Sandoval <osandov@fb.com>
tests/ChangeLog
tests/Makefile.am
tests/getphdrnum.c [new file with mode: 0644]
tests/run-getphdrnum.sh [new file with mode: 0755]
tests/testfile-phdrs.elf.bz2 [new file with mode: 0644]

index cefbceb4f3a8160292fd14b4eba91946384547ef..44ea1c44bc7c806a480a8390c9f6bfa6bb919623 100644 (file)
@@ -1,3 +1,14 @@
+2020-03-22  Omar Sandoval  <osandov@fb.com>
+           Mark Wielaard  <mark@klomp.org>
+
+       * getphdrnum.c: New file.
+       * run-getphdrnum.sh: New test.
+       * testfile-phdrs.elf.bz2: New test file.
+       * Makefile.am (check_PROGRAMS): Add getphdrnum.
+       (TESTS): Add run-getphdrnum.sh.
+       (EXTRA_DIST): Add run-getphdrnum.sh and testfile-phdrs.elf.bz2.
+       (getphdrnum_LDADD): New variable.
+
 2020-03-22  Frank Ch. Eigler  <fche@redhat.com>
 
        * run-debuginfod-find.sh: Look for URL in default progressfn
index a83c3d671423d4d8c684a03cb978c8c1c9ff6a76..934110e0809973d1cf155cc45eaa95ae2fd6f1e3 100644 (file)
@@ -62,7 +62,8 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \
                  get-units-invalid get-units-split attr-integrate-skel \
                  all-dwarf-ranges unit-info next_cfi \
                  elfcopy addsections xlate_notes elfrdwrnop \
-                 dwelf_elf_e_machine_string
+                 dwelf_elf_e_machine_string \
+                 getphdrnum
 
 asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \
            asm-tst6 asm-tst7 asm-tst8 asm-tst9
@@ -168,7 +169,8 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \
        run-dwelf_elf_e_machine_string.sh \
        run-elfclassify.sh run-elfclassify-self.sh \
        run-disasm-riscv64.sh \
-       run-pt_gnu_prop-tests.sh
+       run-pt_gnu_prop-tests.sh \
+       run-getphdrnum.sh
 
 if !BIARCH
 export ELFUTILS_DISABLE_BIARCH = 1
@@ -476,7 +478,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
             debuginfod-tars/pacman-sources/README.md \
             debuginfod-tars/pacman-sources/hello.c \
             run-pt_gnu_prop-tests.sh \
-            testfile_pt_gnu_prop.bz2 testfile_pt_gnu_prop32.bz2
+            testfile_pt_gnu_prop.bz2 testfile_pt_gnu_prop32.bz2 \
+            run-getphdrnum.sh testfile-phdrs.elf.bz2
 
 
 if USE_VALGRIND
@@ -654,6 +657,7 @@ debuginfod_build_id_find_LDADD = $(libelf) $(libdw)
 xlate_notes_LDADD = $(libelf)
 elfrdwrnop_LDADD = $(libelf)
 dwelf_elf_e_machine_string_LDADD = $(libelf) $(libdw)
+getphdrnum_LDADD = $(libelf) $(libdw)
 
 # We want to test the libelf header against the system elf.h header.
 # Don't include any -I CPPFLAGS. Except when we install our own elf.h.
diff --git a/tests/getphdrnum.c b/tests/getphdrnum.c
new file mode 100644 (file)
index 0000000..4d4bb39
--- /dev/null
@@ -0,0 +1,46 @@
+#include <fcntl.h>
+#include <libelf.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+int main (int argc, const char **argv)
+{
+  int fd;
+  Elf *elf;
+  size_t phnum;
+
+  if (argc != 2)
+    {
+      fprintf (stderr, "usage: %s FILE\n", argv[0]);
+      return EXIT_FAILURE;
+    }
+
+  fd = open (argv[1], O_RDONLY);
+  if (fd == -1)
+    {
+      perror ("open");
+      return EXIT_FAILURE;
+    }
+  elf_version (EV_CURRENT);
+  elf = elf_begin (fd, ELF_C_READ, NULL);
+  if (!elf)
+    {
+      fprintf (stderr, "elf_begin: %s\n", elf_errmsg (-1));
+      return EXIT_FAILURE;
+    }
+  if (elf_getphdrnum (elf, &phnum))
+    {
+      fprintf(stderr, "elf_getphdrnum: %s\n", elf_errmsg (-1));
+      return EXIT_FAILURE;
+    }
+
+  printf("%zu\n", phnum);
+
+  elf_end (elf);
+  close (fd);
+
+  return EXIT_SUCCESS;
+}
diff --git a/tests/run-getphdrnum.sh b/tests/run-getphdrnum.sh
new file mode 100755 (executable)
index 0000000..889cdaf
--- /dev/null
@@ -0,0 +1,137 @@
+#! /bin/sh
+
+# testfile-phdrs.elf generated with python3 script
+# import struct
+# import sys
+# 
+# phnum = 66000
+# 
+# sys.stdout.buffer.write(
+#     struct.pack(
+#         "<16BHHIQQQIHHHHHH",
+#         # EI_MAG
+#         *b"\x7fELF",
+#         # EI_CLASS = ELFCLASS64
+#         2,
+#         # EI_DATA = ELFDATA2LSB
+#         1,
+#         # EI_VERSION
+#         1,
+#         # EI_OSABI = ELFOSABI_SYSV
+#         0,
+#         # EI_ABIVERSION
+#         0,
+#         # EI_PAD
+#         *bytes(7),
+#         # e_type = ET_CORE
+#         4,
+#         # e_machine = EM_X86_64
+#         62,
+#         # e_version
+#         1,
+#         # e_entry
+#         0,
+#         # e_phoff = sizeof(Elf64_Ehdr) + sizeof(Elf64_Shdr)
+#         128,
+#         # e_shoff = sizeof(Elf64_Ehdr)
+#         64,
+#         # e_flags
+#         0,
+#         # e_ehsize
+#         64,
+#         # e_phentsize
+#         56,
+#         # e_phnum = PN_XNUM
+#         0xFFFF,
+#         # e_shentsize
+#         64,
+#         # e_shnum
+#         1,
+#         # e_shstrndx
+#         0,
+#     )
+# )
+# 
+# sys.stdout.buffer.write(
+#     struct.pack(
+#         "<IIQQQQIIQQ",
+#         # sh_name
+#         0,
+#         # sh_type = SHT_NULL
+#         0,
+#         # sh_flags
+#         0,
+#         # sh_addr
+#         0,
+#         # sh_offset
+#         0,
+#         # sh_size
+#         0,
+#         # sh_link
+#         0,
+#         # sh_info
+#         phnum,
+#         # sh_addralign
+#         0,
+#         # sh_entsize
+#         0,
+#     )
+# )
+# 
+# for i in range(phnum):
+#     sys.stdout.buffer.write(
+#         struct.pack(
+#             "<IIQQQQQQ",
+#             # p_type = PT_LOAD
+#             1,
+#             # p_flags = PF_X|PF_W|PF_R
+#             0x7,
+#             # p_offset
+#             0,
+#             # p_vaddr
+#             # i * 4096,
+#             4096,
+#             # p_paddr
+#             0,
+#             # p_filesz
+#             0,
+#             # p_memsz
+#             4096,
+#             # p_align
+#             0,
+#         )
+#     )
+
+. $srcdir/test-subr.sh
+
+testfiles testfile-phdrs.elf
+
+testrun_compare ${abs_top_builddir}/src/readelf -h testfile-phdrs.elf<<\EOF
+ELF Header:
+  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
+  Class:                             ELF64
+  Data:                              2's complement, little endian
+  Ident Version:                     1 (current)
+  OS/ABI:                            UNIX - System V
+  ABI Version:                       0
+  Type:                              CORE (Core file)
+  Machine:                           AMD x86-64
+  Version:                           1 (current)
+  Entry point address:               0
+  Start of program headers:          128 (bytes into file)
+  Start of section headers:          64 (bytes into file)
+  Flags:                             
+  Size of this header:               64 (bytes)
+  Size of program header entries:    56 (bytes)
+  Number of program headers entries: 65535 (66000 in [0].sh_info)
+  Size of section header entries:    64 (bytes)
+  Number of section headers entries: 1
+  Section header string table index: 0
+
+EOF
+
+testrun_compare ${abs_builddir}/getphdrnum testfile-phdrs.elf<<\EOF
+66000
+EOF
+
+exit 0
diff --git a/tests/testfile-phdrs.elf.bz2 b/tests/testfile-phdrs.elf.bz2
new file mode 100644 (file)
index 0000000..024ed79
Binary files /dev/null and b/tests/testfile-phdrs.elf.bz2 differ