diff options
| author | Mark Wielaard <[email protected]> | 2015-12-30 01:39:29 +0100 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2016-01-06 14:27:10 +0100 |
| commit | 519c13c9c7fc591609eed405a3e952707c60ec7e (patch) | |
| tree | 00c3afe184607b9d62f6fd81553de14b90a09bc6 /tests | |
| parent | f5013e83d5c8fcd9309c8976c3f1167d28cd07aa (diff) | |
libelf: Make elf_strptr index correctly into compressed section data.
elf_strptr indexes into the section data. This is defined as index into
the uncompressed data of the section. If the section is compressed make
sure the uncompressed data is available, but don't really decompress the
section header (elf_getdata will still return compressed data).
Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ChangeLog | 11 | ||||
| -rw-r--r-- | tests/Makefile.am | 8 | ||||
| -rw-r--r-- | tests/elfputzdata.c | 15 | ||||
| -rwxr-xr-x | tests/run-elfputzdata.sh | 16 | ||||
| -rwxr-xr-x | tests/run-zstrptr.sh | 167 | ||||
| -rw-r--r-- | tests/zstrptr.c | 124 |
6 files changed, 325 insertions, 16 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog index 85b263fd..419610c4 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,14 @@ +2015-11-26 Mark Wielaard <[email protected]> + + * zstrptr.c: New file. + * run-zstrptr.sh: New test. + * elfputzdata.c (main): (re)compress .shstrtab. + * run-elfputzdata.sh: Expect .shstrtab compression. + * Makefile.am (check_PROGRAMS): Add zstrptr. + (TESTS): Add run-zstrptr.sh. + (EXTRA_DIST): Likewise. + (zstrptr_LDADD): New variable. + 2015-10-20 Mark Wielaard <[email protected]> * run-readelf-zx.sh: New test. diff --git a/tests/Makefile.am b/tests/Makefile.am index c86f34fb..6d666e9d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -53,7 +53,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \ buildid deleted deleted-lib.so aggregate_size vdsosyms \ getsrc_die strptr newdata elfstrtab dwfl-proc-attach \ elfshphehdr elfstrmerge dwelfgnucompressed elfgetchdr \ - elfgetzdata elfputzdata + elfgetzdata elfputzdata zstrptr asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ asm-tst6 asm-tst7 asm-tst8 asm-tst9 @@ -123,7 +123,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ run-getsrc-die.sh run-strptr.sh newdata elfstrtab dwfl-proc-attach \ elfshphehdr run-lfs-symbols.sh run-dwelfgnucompressed.sh \ run-elfgetchdr.sh \ - run-elfgetzdata.sh run-elfputzdata.sh + run-elfgetzdata.sh run-elfputzdata.sh run-zstrptr.sh if !BIARCH export ELFUTILS_DISABLE_BIARCH = 1 @@ -319,7 +319,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ run-dwelfgnucompressed.sh \ testfile-zgabi32.bz2 testfile-zgabi64.bz2 \ testfile-zgabi32be.bz2 testfile-zgabi64be.bz2 \ - run-elfgetchdr.sh run-elfgetzdata.sh run-elfputzdata.sh + run-elfgetchdr.sh run-elfgetzdata.sh run-elfputzdata.sh \ + run-zstrptr.sh if USE_VALGRIND valgrind_cmd='valgrind -q --leak-check=full --error-exitcode=1' @@ -472,6 +473,7 @@ dwelfgnucompressed_LDADD = $(libelf) $(libdw) elfgetchdr_LDADD = $(libelf) $(libdw) elfgetzdata_LDADD = $(libelf) elfputzdata_LDADD = $(libelf) +zstrptr_LDADD = $(libelf) if GCOV check: check-am coverage diff --git a/tests/elfputzdata.c b/tests/elfputzdata.c index 65654f88..7e6f0114 100644 --- a/tests/elfputzdata.c +++ b/tests/elfputzdata.c @@ -77,11 +77,7 @@ main (int argc, char *argv[]) GElf_Shdr mem; GElf_Shdr *shdr = gelf_getshdr (scn, &mem); const char *name = elf_strptr (elf, strndx, shdr->sh_name); - if (idx == strndx) - { - printf ("Not compressing section string table %zd\n", idx); - } - else if (shdr->sh_type == SHT_NOBITS + if (shdr->sh_type == SHT_NOBITS || (shdr->sh_flags & SHF_ALLOC) != 0) { printf ("Cannot compress %zd %s\n", idx, name); @@ -221,6 +217,15 @@ main (int argc, char *argv[]) return -1; } free (orig_buf); + // Recompress the string table, just to make sure + // everything keeps working. See elf_strptr above. + if (! gnu && idx == strndx + && elf_compress (scn, ELFCOMPRESS_ZLIB, 0) < 0) + { + printf ("couldn't recompress section header strings: %s\n", + elf_errmsg (-1)); + return -1; + } } } diff --git a/tests/run-elfputzdata.sh b/tests/run-elfputzdata.sh index e9a352e5..b882b3f0 100755 --- a/tests/run-elfputzdata.sh +++ b/tests/run-elfputzdata.sh @@ -53,7 +53,7 @@ Lets compress 29 .debug_info, size: 960 Lets compress 30 .debug_abbrev, size: 405 Lets compress 31 .debug_line, size: 189 Lets compress 32 .note, size: 240 -Not compressing section string table 33 +Lets compress 33 .shstrtab, size: 320 Lets compress 34 .symtab, size: 5488 Lets compress 35 .strtab, size: 5727 EOF @@ -91,7 +91,7 @@ Lets compress 29 .debug_info, size: 960 Lets compress 30 .debug_abbrev, size: 405 Lets compress 31 .debug_line, size: 189 Lets compress 32 .note, size: 240 -Not compressing section string table 33 +Lets compress 33 .shstrtab, size: 320 Lets compress 34 .symtab, size: 5488 Lets compress 35 .strtab, size: 5727 EOF @@ -130,7 +130,7 @@ Lets compress 27 .debug_line, size: 709 Lets compress 28 .debug_frame, size: 56 Lets compress 29 .debug_str, size: 2235 Lets compress 30 .debug_macinfo, size: 10518 -Not compressing section string table 31 +Lets compress 31 .shstrtab, size: 308 Lets compress 32 .symtab, size: 1944 Lets compress 33 .strtab, size: 757 EOF @@ -166,7 +166,7 @@ Lets compress 27 .debug_line, size: 709 Lets compress 28 .debug_frame, size: 56 Lets compress 29 .debug_str, size: 2235 Lets compress 30 .debug_macinfo, size: 10518 -Not compressing section string table 31 +Lets compress 31 .shstrtab, size: 308 Lets compress 32 .symtab, size: 1944 Lets compress 33 .strtab, size: 757 EOF @@ -208,7 +208,7 @@ Lets compress 30 .debug_frame, size: 96 Lets compress 31 .debug_str, size: 174 Lets compress 32 .debug_loc, size: 171 Lets compress 33 .debug_ranges, size: 32 -Not compressing section string table 34 +Lets compress 34 .shstrtab, size: 352 Lets compress 35 .symtab, size: 1800 Lets compress 36 .strtab, size: 602 EOF @@ -247,7 +247,7 @@ Lets compress 30 .debug_frame, size: 96 Lets compress 31 .debug_str, size: 174 Lets compress 32 .debug_loc, size: 171 Lets compress 33 .debug_ranges, size: 32 -Not compressing section string table 34 +Lets compress 34 .shstrtab, size: 352 Lets compress 35 .symtab, size: 1800 Lets compress 36 .strtab, size: 602 EOF @@ -291,7 +291,7 @@ Lets compress 32 .debug_frame, size: 64 Lets compress 33 .debug_str, size: 179 Lets compress 34 .debug_loc, size: 99 Lets compress 35 .debug_ranges, size: 16 -Not compressing section string table 36 +Lets compress 36 .shstrtab, size: 370 Lets compress 37 .symtab, size: 1232 Lets compress 38 .strtab, size: 569 EOF @@ -332,7 +332,7 @@ Lets compress 32 .debug_frame, size: 64 Lets compress 33 .debug_str, size: 179 Lets compress 34 .debug_loc, size: 99 Lets compress 35 .debug_ranges, size: 16 -Not compressing section string table 36 +Lets compress 36 .shstrtab, size: 370 Lets compress 37 .symtab, size: 1232 Lets compress 38 .strtab, size: 569 EOF diff --git a/tests/run-zstrptr.sh b/tests/run-zstrptr.sh new file mode 100755 index 00000000..254dcd85 --- /dev/null +++ b/tests/run-zstrptr.sh @@ -0,0 +1,167 @@ +#! /bin/sh +# Copyright (C) 2015 Red Hat, Inc. +# This file is part of elfutils. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# elfutils is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. $srcdir/test-subr.sh + +# A random 32bit and 64bit testfile +testfiles testfile testfile10 + +testrun_compare ${abs_top_builddir}/tests/zstrptr testfile <<\EOF +Strings in section 32 (compressed): +[0] '' +[1] '.symtab' +[9] '.strtab' +[11] '.shstrtab' +[1b] '.interp' +[23] '.note.ABI-tag' +[31] '.hash' +[37] '.dynsym' +[3f] '.dynstr' +[47] '.gnu.version' +[54] '.gnu.version_r' +[63] '.rel.got' +[6c] '.rel.plt' +[75] '.init' +[7b] '.plt' +[80] '.text' +[86] '.fini' +[8c] '.rodata' +[94] '.data' +[9a] '.eh_frame' +[a4] '.ctors' +[ab] '.dtors' +[b2] '.got' +[b7] '.dynamic' +[c0] '.sbss' +[c6] '.bss' +[cb] '.stab' +[d1] '.stabstr' +[da] '.comment' +[e3] '.debug_aranges' +[f2] '.debug_pubnames' +[102] '.debug_info' +[10e] '.debug_abbrev' +[11c] '.debug_line' +[128] '.note' +Strings in section 32 (uncompressed): +[0] '' +[1] '.symtab' +[9] '.strtab' +[11] '.shstrtab' +[1b] '.interp' +[23] '.note.ABI-tag' +[31] '.hash' +[37] '.dynsym' +[3f] '.dynstr' +[47] '.gnu.version' +[54] '.gnu.version_r' +[63] '.rel.got' +[6c] '.rel.plt' +[75] '.init' +[7b] '.plt' +[80] '.text' +[86] '.fini' +[8c] '.rodata' +[94] '.data' +[9a] '.eh_frame' +[a4] '.ctors' +[ab] '.dtors' +[b2] '.got' +[b7] '.dynamic' +[c0] '.sbss' +[c6] '.bss' +[cb] '.stab' +[d1] '.stabstr' +[da] '.comment' +[e3] '.debug_aranges' +[f2] '.debug_pubnames' +[102] '.debug_info' +[10e] '.debug_abbrev' +[11c] '.debug_line' +[128] '.note' +EOF + +testrun_compare ${abs_top_builddir}/tests/zstrptr testfile10 <<\EOF +Strings in section 30 (compressed): +[0] '' +[1] '.symtab' +[9] '.strtab' +[11] '.shstrtab' +[1b] '.hash' +[21] '.dynsym' +[29] '.dynstr' +[31] '.gnu.version' +[3e] '.gnu.version_r' +[4d] '.rela.dyn' +[57] '.init' +[5d] '.text' +[63] '.fini' +[69] '.eh_frame' +[73] '.data' +[79] '.dynamic' +[82] '.ctors' +[89] '.dtors' +[90] '.jcr' +[95] '.plt' +[9a] '.got' +[9f] '.sdata' +[a6] '.sbss' +[ac] '.bss' +[b1] '.comment' +[ba] '.debug_aranges' +[c9] '.debug_pubnames' +[d9] '.debug_abbrev' +[e7] '.debug_line' +[f3] '.debug_frame' +[100] '.debug_str' +[10b] '.rela.debug_info' +Strings in section 30 (uncompressed): +[0] '' +[1] '.symtab' +[9] '.strtab' +[11] '.shstrtab' +[1b] '.hash' +[21] '.dynsym' +[29] '.dynstr' +[31] '.gnu.version' +[3e] '.gnu.version_r' +[4d] '.rela.dyn' +[57] '.init' +[5d] '.text' +[63] '.fini' +[69] '.eh_frame' +[73] '.data' +[79] '.dynamic' +[82] '.ctors' +[89] '.dtors' +[90] '.jcr' +[95] '.plt' +[9a] '.got' +[9f] '.sdata' +[a6] '.sbss' +[ac] '.bss' +[b1] '.comment' +[ba] '.debug_aranges' +[c9] '.debug_pubnames' +[d9] '.debug_abbrev' +[e7] '.debug_line' +[f3] '.debug_frame' +[100] '.debug_str' +[10b] '.rela.debug_info' +EOF + +exit 0 diff --git a/tests/zstrptr.c b/tests/zstrptr.c new file mode 100644 index 00000000..6d8e19f7 --- /dev/null +++ b/tests/zstrptr.c @@ -0,0 +1,124 @@ +/* Test program for elf_strptr function. + Copyright (C) 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <errno.h> +#include <fcntl.h> +#include <inttypes.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include ELFUTILS_HEADER(elf) +#include <gelf.h> + +int +main (int argc, char *argv[]) +{ + if (argc != 2) + { + printf ("No ELF file given as argument"); + exit (1); + } + + const char *fname = argv[1]; + + // Initialize libelf. + elf_version (EV_CURRENT); + + /* Read the ELF from disk now. */ + int fd = open (fname, O_RDONLY); + if (fd == -1) + { + printf ("cannot open `%s' read-only: %s\n", fname, strerror (errno)); + exit (1); + } + + Elf *elf = elf_begin (fd, ELF_C_READ, NULL); + if (elf == NULL) + { + printf ("cannot create ELF descriptor read-only: %s\n", elf_errmsg (-1)); + exit (1); + } + + size_t ndx; + if (elf_getshdrstrndx (elf, &ndx) != 0) + { + printf ("cannot get section header table index: %s\n", elf_errmsg (-1)); + exit (1); + } + + if (ndx == SHN_UNDEF) + { + printf ("ELF file `%s' doesn't have a section header table index", fname); + exit (1); + } + + Elf_Scn *scn = elf_getscn (elf, ndx); + if (scn == NULL) + { + printf ("Couldn't get section %zd: %s\n", ndx, elf_errmsg (-1)); + exit (1); + } + + void print_strings (void) + { + GElf_Shdr shdr_mem; + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); + + printf ("Strings in section %zd (%s):\n", ndx, + ((shdr->sh_flags & SHF_COMPRESSED) != 0 + ? "compressed" : "uncompressed")); + + size_t off = 0; + const char *str = elf_strptr (elf, ndx, off); + while (str != NULL) + { + printf ("[%zx] '%s'\n", off, str); + off += strlen (str) + 1; + str = elf_strptr (elf, ndx, off); + } + } + + if (elf_compress (scn, ELFCOMPRESS_ZLIB, 0) < 0) + { + printf ("Couldn't compress section %zd: %s\n", ndx, elf_errmsg (-1)); + exit (1); + } + print_strings (); + + if (elf_compress (scn, 0, 0) < 0) + { + printf ("Couldn't decompress section %zd: %s\n", ndx, elf_errmsg (-1)); + exit (1); + } + print_strings (); + + if (elf_end (elf) != 0) + { + printf ("failure in elf_end: %s\n", elf_errmsg (-1)); + exit (1); + } + + close (fd); + + return 0; +} |
