mirror of
https://github.com/openharmony/third_party_elfutils.git
synced 2026-07-19 19:43:34 -04:00
519c13c9c7
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 <mjw@redhat.com>
125 lines
2.9 KiB
C
125 lines
2.9 KiB
C
/* 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;
|
|
}
|