From 7982afbc6ae578e86c235319e79c536a6d867118 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sun, 22 Mar 2020 23:14:24 +0100 Subject: tests: Add testcase for elf_getphdrnum with more than 65535 entries. Signed-off-by: Mark Wielaard Signed-off-by: Omar Sandoval --- tests/ChangeLog | 11 ++++ tests/Makefile.am | 10 +++- tests/getphdrnum.c | 46 +++++++++++++++ tests/run-getphdrnum.sh | 137 +++++++++++++++++++++++++++++++++++++++++++ tests/testfile-phdrs.elf.bz2 | Bin 0 -> 188 bytes 5 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 tests/getphdrnum.c create mode 100755 tests/run-getphdrnum.sh create mode 100644 tests/testfile-phdrs.elf.bz2 diff --git a/tests/ChangeLog b/tests/ChangeLog index cefbceb4..44ea1c44 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,14 @@ +2020-03-22 Omar Sandoval + Mark Wielaard + + * 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 * run-debuginfod-find.sh: Look for URL in default progressfn diff --git a/tests/Makefile.am b/tests/Makefile.am index a83c3d67..934110e0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 00000000..4d4bb397 --- /dev/null +++ b/tests/getphdrnum.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include +#include + +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 index 00000000..889cdaf1 --- /dev/null +++ b/tests/run-getphdrnum.sh @@ -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( +# "