mirror of
https://github.com/openharmony/third_party_elfutils.git
synced 2026-07-01 06:41:51 -04:00
dwelf: Add string table functions from ebl.
Move the strtab functions from libebl to libdw. Programs often want to create ELF/DWARF string tables. We don't want (static) linking against ebl since those are internal functions that might change. This introduces dwelf_strtab_init, dwelf_strtab_add, dwelf_strtab_add_len, dwelf_strtab_finalize, dwelf_strent_off, dwelf_strent_str and dwelf_strtab_free. Documentation for each has been added to libdwelf.h. The add fucntion got a variant that takes the length explicitly and finalize was changed to return NULL on out of memory instead of aborting. All code and tests now uses the new functions. Signed-off-by: Mark Wielaard <mjw@redhat.com>
This commit is contained in:
@@ -1,3 +1,20 @@
|
||||
2016-07-08 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* Makefile.am (AM_CPPFLAGS): Add libdwelf.
|
||||
(libasm.so): Add libdw.
|
||||
* asm_begin.c (prepare_binary_output): Use dwelf_strtab instead of
|
||||
ebl_strtab.
|
||||
* asm_end.c (binary_end): Likewise.
|
||||
(__libasm_finictx): Likewise.
|
||||
* asm_newabssym.c (asm_newabssym): Likewise.
|
||||
* asm_newcomsym.c (asm_newcomsym): Likewise.
|
||||
* asm_newscn.c (binary_newscn): Likewise.
|
||||
* asm_newscngrp.c (asm_newscngrp): Likewise.
|
||||
* asm_newsym.c (asm_newsym): Likewise.
|
||||
* libasmP.h: Likewise.
|
||||
* symbolhash.c (COMPARE): Likewise.
|
||||
* symbolhash.h (COMPARE): Likewise.
|
||||
|
||||
2016-06-28 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* disasm_cb.c (disasm_cb): Pass ebl to disasm hook.
|
||||
|
||||
+3
-2
@@ -28,7 +28,7 @@
|
||||
## not, see <http://www.gnu.org/licenses/>.
|
||||
##
|
||||
include $(top_srcdir)/config/eu.am
|
||||
AM_CPPFLAGS += -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl -I$(top_srcdir)/libdw
|
||||
AM_CPPFLAGS += -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl -I$(top_srcdir)/libdw -I$(top_srcdir)/libdwelf
|
||||
|
||||
GCC_INCLUDE = -I$(shell $(CC) -print-file-name=include)
|
||||
VERSION = 1
|
||||
@@ -65,7 +65,8 @@ libasm.so$(EXEEXT): libasm_pic.a libasm.map
|
||||
$(AM_V_CCLD)$(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
|
||||
-Wl,--version-script,$(srcdir)/libasm.map,--no-undefined \
|
||||
-Wl,--soname,$@.$(VERSION) \
|
||||
../libebl/libebl.a ../libelf/libelf.so $(libasm_so_LDLIBS)
|
||||
../libebl/libebl.a ../libelf/libelf.so ../libdw/libdw.so \
|
||||
$(libasm_so_LDLIBS)
|
||||
@$(textrel_check)
|
||||
$(AM_V_at)ln -fs $@ $@.$(VERSION)
|
||||
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
/* Create descriptor for assembling.
|
||||
Copyright (C) 2002 Red Hat, Inc.
|
||||
Copyright (C) 2002, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -115,8 +115,8 @@ prepare_binary_output (AsmCtx_t *result, Ebl *ebl)
|
||||
asm_symbol_tab_init (&result->symbol_tab, 67);
|
||||
result->nsymbol_tab = 0;
|
||||
/* And the string tables. */
|
||||
result->section_strtab = ebl_strtabinit (true);
|
||||
result->symbol_strtab = ebl_strtabinit (true);
|
||||
result->section_strtab = dwelf_strtab_init (true);
|
||||
result->symbol_strtab = dwelf_strtab_init (true);
|
||||
|
||||
/* We have no section groups so far. */
|
||||
result->groups = NULL;
|
||||
|
||||
+24
-22
@@ -1,5 +1,5 @@
|
||||
/* Finalize operations on the assembler context, free all resources.
|
||||
Copyright (C) 2002, 2003, 2005 Red Hat, Inc.
|
||||
Copyright (C) 2002, 2003, 2005, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -62,11 +62,11 @@ static int
|
||||
binary_end (AsmCtx_t *ctx)
|
||||
{
|
||||
void *symtab = NULL;
|
||||
struct Ebl_Strent *symscn_strent = NULL;
|
||||
struct Ebl_Strent *strscn_strent = NULL;
|
||||
struct Ebl_Strent *xndxscn_strent = NULL;
|
||||
Dwelf_Strent *symscn_strent = NULL;
|
||||
Dwelf_Strent *strscn_strent = NULL;
|
||||
Dwelf_Strent *xndxscn_strent = NULL;
|
||||
Elf_Scn *shstrscn;
|
||||
struct Ebl_Strent *shstrscn_strent;
|
||||
Dwelf_Strent *shstrscn_strent;
|
||||
size_t shstrscnndx;
|
||||
size_t symscnndx = 0;
|
||||
size_t strscnndx = 0;
|
||||
@@ -136,8 +136,8 @@ binary_end (AsmCtx_t *ctx)
|
||||
if (ctx->nsymbol_tab > 0)
|
||||
{
|
||||
/* Create the symbol table and string table section names. */
|
||||
symscn_strent = ebl_strtabadd (ctx->section_strtab, ".symtab", 8);
|
||||
strscn_strent = ebl_strtabadd (ctx->section_strtab, ".strtab", 8);
|
||||
symscn_strent = dwelf_strtab_add_len (ctx->section_strtab, ".symtab", 8);
|
||||
strscn_strent = dwelf_strtab_add_len (ctx->section_strtab, ".strtab", 8);
|
||||
|
||||
/* Create the symbol string table section. */
|
||||
Elf_Scn *strscn = elf_newscn (ctx->out.elf);
|
||||
@@ -150,7 +150,7 @@ binary_end (AsmCtx_t *ctx)
|
||||
}
|
||||
strscnndx = elf_ndxscn (strscn);
|
||||
|
||||
ebl_strtabfinalize (ctx->symbol_strtab, strtabdata);
|
||||
dwelf_strtab_finalize (ctx->symbol_strtab, strtabdata);
|
||||
|
||||
shdr->sh_type = SHT_STRTAB;
|
||||
assert (shdr->sh_entsize == 0);
|
||||
@@ -190,11 +190,11 @@ binary_end (AsmCtx_t *ctx)
|
||||
uint32_t *xshndx = NULL;
|
||||
AsmSym_t *sym;
|
||||
while ((sym = asm_symbol_tab_iterate (&ctx->symbol_tab, &runp)) != NULL)
|
||||
if (asm_emit_symbol_p (ebl_string (sym->strent)))
|
||||
if (asm_emit_symbol_p (dwelf_strent_str (sym->strent)))
|
||||
{
|
||||
assert (ptr_local <= ptr_nonlocal);
|
||||
|
||||
syment.st_name = ebl_strtaboffset (sym->strent);
|
||||
syment.st_name = dwelf_strent_off (sym->strent);
|
||||
syment.st_info = GELF_ST_INFO (sym->binding, sym->type);
|
||||
syment.st_other = 0;
|
||||
syment.st_value = sym->scn->offset + sym->offset;
|
||||
@@ -240,8 +240,9 @@ binary_end (AsmCtx_t *ctx)
|
||||
|
||||
(void) gelf_update_shdr (xndxscn, shdr);
|
||||
|
||||
xndxscn_strent = ebl_strtabadd (ctx->section_strtab,
|
||||
".symtab_shndx", 14);
|
||||
xndxscn_strent = dwelf_strtab_add_len (ctx->section_strtab,
|
||||
".symtab_shndx",
|
||||
14);
|
||||
|
||||
/* Note that using 'elf32_fsize' instead of
|
||||
'gelf_fsize' here is correct. */
|
||||
@@ -299,13 +300,14 @@ binary_end (AsmCtx_t *ctx)
|
||||
|
||||
|
||||
/* Add the name of the section header string table. */
|
||||
shstrscn_strent = ebl_strtabadd (ctx->section_strtab, ".shstrtab", 10);
|
||||
shstrscn_strent = dwelf_strtab_add_len (ctx->section_strtab,
|
||||
".shstrtab", 10);
|
||||
|
||||
ebl_strtabfinalize (ctx->section_strtab, shstrtabdata);
|
||||
dwelf_strtab_finalize (ctx->section_strtab, shstrtabdata);
|
||||
|
||||
shdr->sh_type = SHT_STRTAB;
|
||||
assert (shdr->sh_entsize == 0);
|
||||
shdr->sh_name = ebl_strtaboffset (shstrscn_strent);
|
||||
shdr->sh_name = dwelf_strent_off (shstrscn_strent);
|
||||
|
||||
(void) gelf_update_shdr (shstrscn, shdr);
|
||||
|
||||
@@ -364,7 +366,7 @@ binary_end (AsmCtx_t *ctx)
|
||||
}
|
||||
|
||||
/* Construct the section header. */
|
||||
shdr->sh_name = ebl_strtaboffset (runp->strent);
|
||||
shdr->sh_name = dwelf_strent_off (runp->strent);
|
||||
shdr->sh_type = SHT_GROUP;
|
||||
shdr->sh_flags = 0;
|
||||
shdr->sh_link = symscnndx;
|
||||
@@ -386,7 +388,7 @@ binary_end (AsmCtx_t *ctx)
|
||||
|
||||
shdr = gelf_getshdr (scn, &shdr_mem);
|
||||
|
||||
shdr->sh_name = ebl_strtaboffset (symscn_strent);
|
||||
shdr->sh_name = dwelf_strent_off (symscn_strent);
|
||||
|
||||
(void) gelf_update_shdr (scn, shdr);
|
||||
|
||||
@@ -397,7 +399,7 @@ binary_end (AsmCtx_t *ctx)
|
||||
|
||||
shdr = gelf_getshdr (scn, &shdr_mem);
|
||||
|
||||
shdr->sh_name = ebl_strtaboffset (strscn_strent);
|
||||
shdr->sh_name = dwelf_strent_off (strscn_strent);
|
||||
|
||||
(void) gelf_update_shdr (scn, shdr);
|
||||
|
||||
@@ -409,7 +411,7 @@ binary_end (AsmCtx_t *ctx)
|
||||
|
||||
shdr = gelf_getshdr (scn, &shdr_mem);
|
||||
|
||||
shdr->sh_name = ebl_strtaboffset (xndxscn_strent);
|
||||
shdr->sh_name = dwelf_strent_off (xndxscn_strent);
|
||||
|
||||
(void) gelf_update_shdr (scn, shdr);
|
||||
}
|
||||
@@ -423,7 +425,7 @@ binary_end (AsmCtx_t *ctx)
|
||||
/* This better should not fail. */
|
||||
assert (shdr != NULL);
|
||||
|
||||
shdr->sh_name = ebl_strtaboffset (asmscn->data.main.strent);
|
||||
shdr->sh_name = dwelf_strent_off (asmscn->data.main.strent);
|
||||
|
||||
/* We now know the maximum alignment. */
|
||||
shdr->sh_addralign = asmscn->max_align;
|
||||
@@ -600,8 +602,8 @@ __libasm_finictx (AsmCtx_t *ctx)
|
||||
(void) close (ctx->fd);
|
||||
|
||||
/* And the string tables. */
|
||||
ebl_strtabfree (ctx->section_strtab);
|
||||
ebl_strtabfree (ctx->symbol_strtab);
|
||||
dwelf_strtab_free (ctx->section_strtab);
|
||||
dwelf_strtab_free (ctx->symbol_strtab);
|
||||
}
|
||||
|
||||
/* Initialize the lock. */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Create new ABS symbol.
|
||||
Copyright (C) 2002 Red Hat, Inc.
|
||||
Copyright (C) 2002, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -80,7 +80,7 @@ asm_newabssym (AsmCtx_t *ctx, const char *name, GElf_Xword size,
|
||||
result->type = type;
|
||||
result->binding = binding;
|
||||
result->symidx = 0;
|
||||
result->strent = ebl_strtabadd (ctx->symbol_strtab, name, 0);
|
||||
result->strent = dwelf_strtab_add (ctx->symbol_strtab, name);
|
||||
|
||||
/* The value of an ABS symbol must not be modified. Since there are
|
||||
no subsection and the initial offset of the section is 0 we can
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Create new COMMON symbol.
|
||||
Copyright (C) 2002 Red Hat, Inc.
|
||||
Copyright (C) 2002, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -82,7 +82,7 @@ asm_newcomsym (AsmCtx_t *ctx, const char *name, GElf_Xword size,
|
||||
/* XXX Do we have to allow a different binding? */
|
||||
result->binding = STB_GLOBAL;
|
||||
result->symidx = 0;
|
||||
result->strent = ebl_strtabadd (ctx->symbol_strtab, name, 0);
|
||||
result->strent = dwelf_strtab_add (ctx->symbol_strtab, name);
|
||||
|
||||
/* The value of a COM symbol is the alignment. Since there are no
|
||||
subsection and the initial offset of the section is 0 we can get
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
/* Create new section in output file.
|
||||
Copyright (C) 2002-2011 Red Hat, Inc.
|
||||
Copyright (C) 2002-2011, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -129,8 +129,8 @@ binary_newscn (AsmScn_t *result, GElf_Word type, GElf_Xword flags,
|
||||
result->subnext = NULL;
|
||||
|
||||
/* Add the name to the section header string table. */
|
||||
result->data.main.strent = ebl_strtabadd (result->ctx->section_strtab,
|
||||
result->name, scnname_len);
|
||||
result->data.main.strent = dwelf_strtab_add_len (result->ctx->section_strtab,
|
||||
result->name, scnname_len);
|
||||
assert (result->data.main.strent != NULL);
|
||||
|
||||
/* Create the new ELF section. */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Create new section group.
|
||||
Copyright (C) 2002 Red Hat, Inc.
|
||||
Copyright (C) 2002, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -67,8 +67,8 @@ asm_newscngrp (AsmCtx_t *ctx, const char *grpname, AsmSym_t *signature,
|
||||
result->flags = flags;
|
||||
|
||||
memcpy (result->name, grpname, grpname_len);
|
||||
result->strent = ebl_strtabadd (ctx->section_strtab, result->name,
|
||||
grpname_len);
|
||||
result->strent = dwelf_strtab_add_len (ctx->section_strtab, result->name,
|
||||
grpname_len);
|
||||
|
||||
if (unlikely (ctx->textp))
|
||||
// XXX TBI. What is the format?
|
||||
|
||||
+4
-4
@@ -1,5 +1,5 @@
|
||||
/* Define new symbol for current position in given section.
|
||||
Copyright (C) 2002, 2005 Red Hat, Inc.
|
||||
Copyright (C) 2002, 2005, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
@@ -83,8 +83,8 @@ asm_newsym (AsmScn_t *asmscn, const char *name, GElf_Xword size,
|
||||
result->type = type;
|
||||
result->binding = binding;
|
||||
result->symidx = 0;
|
||||
result->strent = ebl_strtabadd (asmscn->ctx->symbol_strtab,
|
||||
memcpy (result + 1, name, name_len), 0);
|
||||
result->strent = dwelf_strtab_add (asmscn->ctx->symbol_strtab,
|
||||
memcpy (result + 1, name, name_len));
|
||||
|
||||
if (unlikely (asmscn->ctx->textp))
|
||||
{
|
||||
@@ -118,7 +118,7 @@ asm_newsym (AsmScn_t *asmscn, const char *name, GElf_Xword size,
|
||||
reference in the string table to the string. We can only
|
||||
fail to insert the symbol into the symbol table if there
|
||||
is already a symbol with this name. In this case the
|
||||
ebl_strtabadd function would use the previously provided
|
||||
dwelf_strtab_add function would use the previously provided
|
||||
name. */
|
||||
free (result);
|
||||
result = NULL;
|
||||
|
||||
+8
-6
@@ -1,5 +1,5 @@
|
||||
/* Internal definitions for libasm.
|
||||
Copyright (C) 2002, 2004, 2005 Red Hat, Inc.
|
||||
Copyright (C) 2002, 2004, 2005, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify
|
||||
@@ -33,6 +33,8 @@
|
||||
|
||||
#include <libasm.h>
|
||||
|
||||
#include "libdwelf.h"
|
||||
|
||||
/* gettext helper macros. */
|
||||
#define _(Str) dgettext ("elfutils", Str)
|
||||
|
||||
@@ -85,7 +87,7 @@ struct AsmScn
|
||||
Elf_Scn *scn;
|
||||
|
||||
/* Entry in the section header string table. */
|
||||
struct Ebl_Strent *strent;
|
||||
Dwelf_Strent *strent;
|
||||
|
||||
/* Next member of group. */
|
||||
struct AsmScn *next_in_group;
|
||||
@@ -156,14 +158,14 @@ struct AsmCtx
|
||||
/* List with defined sections. */
|
||||
AsmScn_t *section_list;
|
||||
/* Section header string table. */
|
||||
struct Ebl_Strtab *section_strtab;
|
||||
Dwelf_Strtab *section_strtab;
|
||||
|
||||
/* Table with defined symbols. */
|
||||
asm_symbol_tab symbol_tab;
|
||||
/* Number of symbols in the table. */
|
||||
unsigned int nsymbol_tab;
|
||||
/* Symbol string table. */
|
||||
struct Ebl_Strtab *symbol_strtab;
|
||||
Dwelf_Strtab *symbol_strtab;
|
||||
|
||||
/* List of section groups. */
|
||||
struct AsmScnGrp *groups;
|
||||
@@ -207,7 +209,7 @@ struct AsmSym
|
||||
size_t symidx;
|
||||
|
||||
/* Reference to name of the symbol. */
|
||||
struct Ebl_Strent *strent;
|
||||
Dwelf_Strent *strent;
|
||||
};
|
||||
|
||||
|
||||
@@ -215,7 +217,7 @@ struct AsmSym
|
||||
struct AsmScnGrp
|
||||
{
|
||||
/* Entry in the section header string table. */
|
||||
struct Ebl_Strent *strent;
|
||||
Dwelf_Strent *strent;
|
||||
|
||||
/* The ELF section. */
|
||||
Elf_Scn *scn;
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/* Symbol hash table implementation.
|
||||
Copyright (C) 2001, 2002 Red Hat, Inc.
|
||||
Copyright (C) 2001, 2002, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
#define ITERATE 1
|
||||
#define REVERSE 1
|
||||
#define COMPARE(a, b) \
|
||||
strcmp (ebl_string ((a)->strent), ebl_string ((b)->strent))
|
||||
strcmp (dwelf_strent_str ((a)->strent), dwelf_strent_str ((b)->strent))
|
||||
|
||||
#define next_prime __libasm_next_prime
|
||||
extern size_t next_prime (size_t) attribute_hidden;
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@
|
||||
#define NAME asm_symbol_tab
|
||||
#define ITERATE 1
|
||||
#define COMPARE(a, b) \
|
||||
strcmp (ebl_string ((a)->strent), ebl_string ((b)->strent))
|
||||
strcmp (dwelf_strent_str ((a)->strent), dwelf_strent_str ((b)->strent))
|
||||
#include <dynamicsizehash.h>
|
||||
|
||||
#endif /* symbolhash.h */
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
2016-07-08 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* libdw.map (ELFUTILS_0.167): New. Add dwelf_strtab_init,
|
||||
dwelf_strtab_add, dwelf_strtab_add_len, dwelf_strtab_finalize,
|
||||
dwelf_strent_off, dwelf_strent_str and dwelf_strtab_free.
|
||||
|
||||
2016-02-13 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* dwarf_getsrclines.c (read_srclines): Calculate ndirs first, then
|
||||
|
||||
@@ -327,3 +327,14 @@ ELFUTILS_0.165 {
|
||||
global:
|
||||
dwelf_scn_gnu_compressed_size;
|
||||
} ELFUTILS_0.161;
|
||||
|
||||
ELFUTILS_0.167 {
|
||||
global:
|
||||
dwelf_strtab_init;
|
||||
dwelf_strtab_add;
|
||||
dwelf_strtab_add_len;
|
||||
dwelf_strtab_finalize;
|
||||
dwelf_strent_off;
|
||||
dwelf_strent_str;
|
||||
dwelf_strtab_free;
|
||||
} ELFUTILS_0.165;
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
2016-07-08 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* Makefile.am (libdwelf_a_SOURCES): Add dwelf_strtab.c.
|
||||
* dwelf_strtab.c: New file.
|
||||
* libdwelf.h (Dwelf_Strtab): New typedef.
|
||||
(Dwelf_Strent): Likewise.
|
||||
(dwelf_strtab_init): New function.
|
||||
(dwelf_strtab_add): Likewise.
|
||||
(dwelf_strtab_add_len): Likewise.
|
||||
(dwelf_strtab_finalize): Likewise.
|
||||
(dwelf_strent_off): Likewise.
|
||||
(dwelf_strent_str): Likewise.
|
||||
(dwelf_strtab_free): Likewise.
|
||||
|
||||
2015-10-28 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* Makefile.am (libdwelf_a_SOURCES): Add
|
||||
|
||||
@@ -40,7 +40,8 @@ pkginclude_HEADERS = libdwelf.h
|
||||
noinst_HEADERS = libdwelfP.h
|
||||
|
||||
libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c dwelf_dwarf_gnu_debugaltlink.c \
|
||||
dwelf_elf_gnu_build_id.c dwelf_scn_gnu_compressed_size.c
|
||||
dwelf_elf_gnu_build_id.c dwelf_scn_gnu_compressed_size.c \
|
||||
dwelf_strtab.c
|
||||
|
||||
libdwelf = $(libdw)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* ELF string table handling.
|
||||
Copyright (C) 2000, 2001, 2002, 2005 Red Hat, Inc.
|
||||
/* ELF/DWARF string table handling.
|
||||
Copyright (C) 2000, 2001, 2002, 2005, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include "libebl.h"
|
||||
#include "libdwelfP.h"
|
||||
#include <system.h>
|
||||
|
||||
#ifndef MIN
|
||||
@@ -48,13 +48,13 @@
|
||||
#endif
|
||||
|
||||
|
||||
struct Ebl_Strent
|
||||
struct Dwelf_Strent
|
||||
{
|
||||
const char *string;
|
||||
size_t len;
|
||||
struct Ebl_Strent *next;
|
||||
struct Ebl_Strent *left;
|
||||
struct Ebl_Strent *right;
|
||||
struct Dwelf_Strent *next;
|
||||
struct Dwelf_Strent *left;
|
||||
struct Dwelf_Strent *right;
|
||||
size_t offset;
|
||||
char reverse[0];
|
||||
};
|
||||
@@ -67,16 +67,16 @@ struct memoryblock
|
||||
};
|
||||
|
||||
|
||||
struct Ebl_Strtab
|
||||
struct Dwelf_Strtab
|
||||
{
|
||||
struct Ebl_Strent *root;
|
||||
struct Dwelf_Strent *root;
|
||||
struct memoryblock *memory;
|
||||
char *backp;
|
||||
size_t left;
|
||||
size_t total;
|
||||
bool nullstr;
|
||||
|
||||
struct Ebl_Strent null;
|
||||
struct Dwelf_Strent null;
|
||||
};
|
||||
|
||||
|
||||
@@ -87,8 +87,8 @@ static size_t ps;
|
||||
#define MALLOC_OVERHEAD (2 * sizeof (void *))
|
||||
|
||||
|
||||
struct Ebl_Strtab *
|
||||
ebl_strtabinit (bool nullstr)
|
||||
Dwelf_Strtab *
|
||||
dwelf_strtab_init (bool nullstr)
|
||||
{
|
||||
if (ps == 0)
|
||||
{
|
||||
@@ -96,8 +96,8 @@ ebl_strtabinit (bool nullstr)
|
||||
assert (sizeof (struct memoryblock) < ps - MALLOC_OVERHEAD);
|
||||
}
|
||||
|
||||
struct Ebl_Strtab *ret
|
||||
= (struct Ebl_Strtab *) calloc (1, sizeof (struct Ebl_Strtab));
|
||||
Dwelf_Strtab *ret
|
||||
= (Dwelf_Strtab *) calloc (1, sizeof (struct Dwelf_Strtab));
|
||||
if (ret != NULL)
|
||||
{
|
||||
ret->nullstr = nullstr;
|
||||
@@ -114,7 +114,7 @@ ebl_strtabinit (bool nullstr)
|
||||
|
||||
|
||||
static int
|
||||
morememory (struct Ebl_Strtab *st, size_t len)
|
||||
morememory (Dwelf_Strtab *st, size_t len)
|
||||
{
|
||||
size_t overhead = offsetof (struct memoryblock, memory);
|
||||
len += overhead + MALLOC_OVERHEAD;
|
||||
@@ -136,7 +136,7 @@ morememory (struct Ebl_Strtab *st, size_t len)
|
||||
|
||||
|
||||
void
|
||||
ebl_strtabfree (struct Ebl_Strtab *st)
|
||||
dwelf_strtab_free (Dwelf_Strtab *st)
|
||||
{
|
||||
struct memoryblock *mb = st->memory;
|
||||
|
||||
@@ -151,26 +151,26 @@ ebl_strtabfree (struct Ebl_Strtab *st)
|
||||
}
|
||||
|
||||
|
||||
static struct Ebl_Strent *
|
||||
newstring (struct Ebl_Strtab *st, const char *str, size_t len)
|
||||
static Dwelf_Strent *
|
||||
newstring (Dwelf_Strtab *st, const char *str, size_t len)
|
||||
{
|
||||
/* Compute the amount of padding needed to make the structure aligned. */
|
||||
size_t align = ((__alignof__ (struct Ebl_Strent)
|
||||
size_t align = ((__alignof__ (struct Dwelf_Strent)
|
||||
- (((uintptr_t) st->backp)
|
||||
& (__alignof__ (struct Ebl_Strent) - 1)))
|
||||
& (__alignof__ (struct Ebl_Strent) - 1));
|
||||
& (__alignof__ (struct Dwelf_Strent) - 1)))
|
||||
& (__alignof__ (struct Dwelf_Strent) - 1));
|
||||
|
||||
/* Make sure there is enough room in the memory block. */
|
||||
if (st->left < align + sizeof (struct Ebl_Strent) + len)
|
||||
if (st->left < align + sizeof (struct Dwelf_Strent) + len)
|
||||
{
|
||||
if (morememory (st, sizeof (struct Ebl_Strent) + len))
|
||||
if (morememory (st, sizeof (struct Dwelf_Strent) + len))
|
||||
return NULL;
|
||||
|
||||
align = 0;
|
||||
}
|
||||
|
||||
/* Create the reserved string. */
|
||||
struct Ebl_Strent *newstr = (struct Ebl_Strent *) (st->backp + align);
|
||||
Dwelf_Strent *newstr = (Dwelf_Strent *) (st->backp + align);
|
||||
newstr->string = str;
|
||||
newstr->len = len;
|
||||
newstr->next = NULL;
|
||||
@@ -180,8 +180,8 @@ newstring (struct Ebl_Strtab *st, const char *str, size_t len)
|
||||
for (int i = len - 2; i >= 0; --i)
|
||||
newstr->reverse[i] = str[len - 2 - i];
|
||||
newstr->reverse[len - 1] = '\0';
|
||||
st->backp += align + sizeof (struct Ebl_Strent) + len;
|
||||
st->left -= align + sizeof (struct Ebl_Strent) + len;
|
||||
st->backp += align + sizeof (struct Dwelf_Strent) + len;
|
||||
st->left -= align + sizeof (struct Dwelf_Strent) + len;
|
||||
|
||||
return newstr;
|
||||
}
|
||||
@@ -190,8 +190,8 @@ newstring (struct Ebl_Strtab *st, const char *str, size_t len)
|
||||
/* XXX This function should definitely be rewritten to use a balancing
|
||||
tree algorith (AVL, red-black trees). For now a simple, correct
|
||||
implementation is enough. */
|
||||
static struct Ebl_Strent **
|
||||
searchstring (struct Ebl_Strent **sep, struct Ebl_Strent *newstr)
|
||||
static Dwelf_Strent **
|
||||
searchstring (Dwelf_Strent **sep, Dwelf_Strent *newstr)
|
||||
{
|
||||
/* More strings? */
|
||||
if (*sep == NULL)
|
||||
@@ -214,34 +214,30 @@ searchstring (struct Ebl_Strent **sep, struct Ebl_Strent *newstr)
|
||||
|
||||
|
||||
/* Add new string. The actual string is assumed to be permanent. */
|
||||
struct Ebl_Strent *
|
||||
ebl_strtabadd (struct Ebl_Strtab *st, const char *str, size_t len)
|
||||
static Dwelf_Strent *
|
||||
strtab_add (Dwelf_Strtab *st, const char *str, size_t len)
|
||||
{
|
||||
/* Compute the string length if the caller doesn't know it. */
|
||||
if (len == 0)
|
||||
len = strlen (str) + 1;
|
||||
|
||||
/* Make sure all "" strings get offset 0 but only if the table was
|
||||
created with a special null entry in mind. */
|
||||
if (len == 1 && st->null.string != NULL)
|
||||
return &st->null;
|
||||
|
||||
/* Allocate memory for the new string and its associated information. */
|
||||
struct Ebl_Strent *newstr = newstring (st, str, len);
|
||||
Dwelf_Strent *newstr = newstring (st, str, len);
|
||||
if (newstr == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Search in the array for the place to insert the string. If there
|
||||
is no string with matching prefix and no string with matching
|
||||
leading substring, create a new entry. */
|
||||
struct Ebl_Strent **sep = searchstring (&st->root, newstr);
|
||||
Dwelf_Strent **sep = searchstring (&st->root, newstr);
|
||||
if (*sep != newstr)
|
||||
{
|
||||
/* This is not the same entry. This means we have a prefix match. */
|
||||
if ((*sep)->len > newstr->len)
|
||||
{
|
||||
/* Check whether we already know this string. */
|
||||
for (struct Ebl_Strent *subs = (*sep)->next; subs != NULL;
|
||||
for (Dwelf_Strent *subs = (*sep)->next; subs != NULL;
|
||||
subs = subs->next)
|
||||
if (subs->len == newstr->len)
|
||||
{
|
||||
@@ -287,9 +283,20 @@ ebl_strtabadd (struct Ebl_Strtab *st, const char *str, size_t len)
|
||||
return newstr;
|
||||
}
|
||||
|
||||
Dwelf_Strent *
|
||||
dwelf_strtab_add (Dwelf_Strtab *st, const char *str)
|
||||
{
|
||||
return strtab_add (st, str, strlen (str) + 1);
|
||||
}
|
||||
|
||||
Dwelf_Strent *
|
||||
dwelf_strtab_add_len (Dwelf_Strtab *st, const char *str, size_t len)
|
||||
{
|
||||
return strtab_add (st, str, len);
|
||||
}
|
||||
|
||||
static void
|
||||
copystrings (struct Ebl_Strent *nodep, char **freep, size_t *offsetp)
|
||||
copystrings (Dwelf_Strent *nodep, char **freep, size_t *offsetp)
|
||||
{
|
||||
if (nodep->left != NULL)
|
||||
copystrings (nodep->left, freep, offsetp);
|
||||
@@ -299,7 +306,7 @@ copystrings (struct Ebl_Strent *nodep, char **freep, size_t *offsetp)
|
||||
*freep = (char *) mempcpy (*freep, nodep->string, nodep->len);
|
||||
*offsetp += nodep->len;
|
||||
|
||||
for (struct Ebl_Strent *subs = nodep->next; subs != NULL; subs = subs->next)
|
||||
for (Dwelf_Strent *subs = nodep->next; subs != NULL; subs = subs->next)
|
||||
{
|
||||
assert (subs->len < nodep->len);
|
||||
subs->offset = nodep->offset + nodep->len - subs->len;
|
||||
@@ -311,15 +318,15 @@ copystrings (struct Ebl_Strent *nodep, char **freep, size_t *offsetp)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ebl_strtabfinalize (struct Ebl_Strtab *st, Elf_Data *data)
|
||||
Elf_Data *
|
||||
dwelf_strtab_finalize (Dwelf_Strtab *st, Elf_Data *data)
|
||||
{
|
||||
size_t nulllen = st->nullstr ? 1 : 0;
|
||||
|
||||
/* Fill in the information. */
|
||||
data->d_buf = malloc (st->total + nulllen);
|
||||
if (data->d_buf == NULL)
|
||||
abort ();
|
||||
return NULL;
|
||||
|
||||
/* The first byte must always be zero if we created the table with a
|
||||
null string. */
|
||||
@@ -339,20 +346,20 @@ ebl_strtabfinalize (struct Ebl_Strtab *st, Elf_Data *data)
|
||||
if (st->root)
|
||||
copystrings (st->root, &endp, ©len);
|
||||
assert (copylen == st->total + nulllen);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
ebl_strtaboffset (struct Ebl_Strent *se)
|
||||
dwelf_strent_off (Dwelf_Strent *se)
|
||||
{
|
||||
return se->offset;
|
||||
}
|
||||
|
||||
|
||||
const char *
|
||||
ebl_string (struct Ebl_Strent *se)
|
||||
dwelf_strent_str (Dwelf_Strent *se)
|
||||
{
|
||||
assert (se->string != NULL);
|
||||
|
||||
return se->string;
|
||||
}
|
||||
+54
-1
@@ -1,5 +1,5 @@
|
||||
/* Interfaces for libdwelf. DWARF ELF Low-level Functions.
|
||||
Copyright (C) 2014, 2015 Red Hat, Inc.
|
||||
Copyright (C) 2014, 2015, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify
|
||||
@@ -72,6 +72,59 @@ extern ssize_t dwelf_elf_gnu_build_id (Elf *elf, const void **build_idp);
|
||||
error occured -1 is returned and elf_errno is set. */
|
||||
extern ssize_t dwelf_scn_gnu_compressed_size (Elf_Scn *scn);
|
||||
|
||||
/* ELF/DWARF string table handling. */
|
||||
typedef struct Dwelf_Strtab Dwelf_Strtab;
|
||||
typedef struct Dwelf_Strent Dwelf_Strent;
|
||||
|
||||
/* Create a new ELF/DWARF string table object in memory. ELF string
|
||||
tables have a required zero length null string at offset zero.
|
||||
DWARF string tables don't require such a null entry (unless they
|
||||
are shared with an ELF string table). If NULLSTR is true then a
|
||||
null entry is always created (even if the string table is empty
|
||||
otherwise). */
|
||||
extern Dwelf_Strtab *dwelf_strtab_init (bool nullstr);
|
||||
|
||||
/* Add string STR to string table ST. Returns NULL if no memory could
|
||||
be allocated. The given STR is owned by the called and must be
|
||||
valid till dwelf_strtab_free is called. dwelf_strtab_finalize
|
||||
might copy the string into the final table and dwelf_strent_str
|
||||
might return it, or a reference to an identical copy/substring
|
||||
added to the string table. */
|
||||
extern Dwelf_Strent *dwelf_strtab_add (Dwelf_Strtab *st, const char *str)
|
||||
__nonnull_attribute__ (1, 2);
|
||||
|
||||
/* This is an optimized version of dwelf_strtab_add if the length of
|
||||
the string is already known. LEN is the length of STR including
|
||||
zero terminator. Calling dwelf_strtab_add (st, str) is similar to
|
||||
calling dwelf_strtab_len (st, str, strlen (str) + 1). */
|
||||
extern Dwelf_Strent *dwelf_strtab_add_len (Dwelf_Strtab *st,
|
||||
const char *str, size_t len)
|
||||
__nonnull_attribute__ (1, 2);
|
||||
|
||||
/* Finalize string table ST and store size and memory location
|
||||
information in DATA d_size and d_buf. DATA d_type will be set to
|
||||
ELF_T_BYTE, d_off will be zero, d_align will be 1 and d_version
|
||||
will be set to EV_CURRENT. If no memory could be allocated NULL is
|
||||
returned and DATA->d_buf will be set to NULL. Otherwise DATA will
|
||||
be returned. */
|
||||
extern Elf_Data *dwelf_strtab_finalize (Dwelf_Strtab *st,
|
||||
Elf_Data *data)
|
||||
__nonnull_attribute__ (1, 2);
|
||||
|
||||
/* Get offset in string table for string associated with entry. Only
|
||||
valid after dwelf_strtab_finalize has been called. */
|
||||
extern size_t dwelf_strent_off (Dwelf_Strent *se)
|
||||
__nonnull_attribute__ (1);
|
||||
|
||||
/* Return the string associated with the entry. */
|
||||
extern const char *dwelf_strent_str (Dwelf_Strent *se)
|
||||
__nonnull_attribute__ (1);
|
||||
|
||||
/* Free resources allocated for the string table. This invalidates
|
||||
any Dwelf_Strent references returned earlier. */
|
||||
extern void dwelf_strtab_free (Dwelf_Strtab *st)
|
||||
__nonnull_attribute__ (1);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
2016-07-08 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* Makefile.am (gen_SOURCES): Remove eblstrtab.c.
|
||||
* eblstrtab.c: Removed.
|
||||
* libebl.h (Ebl_Strtab): Removed.
|
||||
(Ebl_Strent): Removed.
|
||||
(ebl_strtabinit): Removed.
|
||||
(ebl_strtabfree): Removed.
|
||||
(ebl_strtabadd): Removed.
|
||||
(ebl_strtabfinalize): Removed.
|
||||
(ebl_strtaboffset): Removed.
|
||||
(ebl_string): Removed.
|
||||
|
||||
2016-07-06 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* Makefile.am (gen_SOURCES): Remove eblobjecttypename.c,
|
||||
|
||||
+1
-1
@@ -37,7 +37,7 @@ lib_LIBRARIES = libebl.a
|
||||
|
||||
pkginclude_HEADERS = libebl.h
|
||||
|
||||
gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \
|
||||
gen_SOURCES = eblopenbackend.c eblclosebackend.c \
|
||||
eblreloctypename.c eblsegmenttypename.c \
|
||||
eblsectiontypename.c eblmachineflagname.c \
|
||||
eblsymboltypename.c ebldynamictagname.c eblsectionname.c \
|
||||
|
||||
@@ -287,31 +287,6 @@ extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
|
||||
extern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
|
||||
__nonnull_attribute__ (2);
|
||||
|
||||
/* ELF string table handling. */
|
||||
struct Ebl_Strtab;
|
||||
struct Ebl_Strent;
|
||||
|
||||
/* Create new ELF string table object in memory. */
|
||||
extern struct Ebl_Strtab *ebl_strtabinit (bool nullstr);
|
||||
|
||||
/* Free resources allocated for ELF string table ST. */
|
||||
extern void ebl_strtabfree (struct Ebl_Strtab *st);
|
||||
|
||||
/* Add string STR (length LEN is != 0) to ELF string table ST. */
|
||||
extern struct Ebl_Strent *ebl_strtabadd (struct Ebl_Strtab *st,
|
||||
const char *str, size_t len);
|
||||
|
||||
/* Finalize string table ST and store size and memory location information
|
||||
in DATA. */
|
||||
extern void ebl_strtabfinalize (struct Ebl_Strtab *st, Elf_Data *data);
|
||||
|
||||
/* Get offset in string table for string associated with SE. */
|
||||
extern size_t ebl_strtaboffset (struct Ebl_Strent *se);
|
||||
|
||||
/* Return the string associated with SE. */
|
||||
extern const char *ebl_string (struct Ebl_Strent *se);
|
||||
|
||||
|
||||
/* Register map info. */
|
||||
typedef struct
|
||||
{
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
2016-07-08 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* Makefile.am (strip_LDADD): Add libdw.
|
||||
* elfcompress.c (process_file): Use dwelf_strtab functions instead of
|
||||
ebl_strtab.
|
||||
* strip.c (handle_elf): Likewise.
|
||||
* unstrip.c (new_shstrtab): Likewise.
|
||||
|
||||
2016-07-06 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* elf32-i386.script, i386_ld.c, ld.c, ld.h, ldgeneric.c, ldlex.l,
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl
|
||||
nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl \
|
||||
$(demanglelib)
|
||||
size_LDADD = $(libelf) $(libeu) $(argp_LDADD)
|
||||
strip_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl
|
||||
strip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(argp_LDADD) -ldl
|
||||
elflint_LDADD = $(libebl) $(libelf) $(libeu) $(argp_LDADD) -ldl
|
||||
findtextrel_LDADD = $(libdw) $(libelf) $(argp_LDADD)
|
||||
addr2line_LDADD = $(libdw) $(libelf) $(argp_LDADD) $(demanglelib)
|
||||
|
||||
+18
-13
@@ -32,6 +32,7 @@
|
||||
#include <unistd.h>
|
||||
#include ELFUTILS_HEADER(elf)
|
||||
#include ELFUTILS_HEADER(ebl)
|
||||
#include ELFUTILS_HEADER(dwelf)
|
||||
#include <gelf.h>
|
||||
#include "system.h"
|
||||
|
||||
@@ -265,9 +266,9 @@ process_file (const char *fname)
|
||||
char *snamebuf = NULL;
|
||||
|
||||
/* String table (and symbol table), if section names need adjusting. */
|
||||
struct Ebl_Strtab *names = NULL;
|
||||
struct Ebl_Strent **scnstrents = NULL;
|
||||
struct Ebl_Strent **symstrents = NULL;
|
||||
Dwelf_Strtab *names = NULL;
|
||||
Dwelf_Strent **scnstrents = NULL;
|
||||
Dwelf_Strent **symstrents = NULL;
|
||||
char **scnnames = NULL;
|
||||
|
||||
/* Section data from names. */
|
||||
@@ -308,7 +309,7 @@ process_file (const char *fname)
|
||||
free (snamebuf);
|
||||
if (names != NULL)
|
||||
{
|
||||
ebl_strtabfree (names);
|
||||
dwelf_strtab_free (names);
|
||||
free (scnstrents);
|
||||
free (symstrents);
|
||||
free (namesbuf);
|
||||
@@ -524,14 +525,14 @@ process_file (const char *fname)
|
||||
|
||||
if (adjust_names)
|
||||
{
|
||||
names = ebl_strtabinit (true);
|
||||
names = dwelf_strtab_init (true);
|
||||
if (names == NULL)
|
||||
{
|
||||
error (0, 0, "Not enough memory for new strtab");
|
||||
return cleanup (-1);
|
||||
}
|
||||
scnstrents = xmalloc (shnum
|
||||
* sizeof (struct Ebl_Strent *));
|
||||
* sizeof (Dwelf_Strent *));
|
||||
scnnames = xcalloc (shnum, sizeof (char *));
|
||||
}
|
||||
|
||||
@@ -870,7 +871,7 @@ process_file (const char *fname)
|
||||
|
||||
/* We need to keep a copy of the name till the strtab is done. */
|
||||
name = scnnames[ndx] = xstrdup (name);
|
||||
if ((scnstrents[ndx] = ebl_strtabadd (names, name, 0)) == NULL)
|
||||
if ((scnstrents[ndx] = dwelf_strtab_add (names, name)) == NULL)
|
||||
{
|
||||
error (0, 0, "No memory to add section name string table");
|
||||
return cleanup (-1);
|
||||
@@ -916,7 +917,7 @@ process_file (const char *fname)
|
||||
}
|
||||
size_t elsize = gelf_fsize (elfnew, ELF_T_SYM, 1, EV_CURRENT);
|
||||
size_t syms = symd->d_size / elsize;
|
||||
symstrents = xmalloc (syms * sizeof (struct Ebl_Strent *));
|
||||
symstrents = xmalloc (syms * sizeof (Dwelf_Strent *));
|
||||
for (size_t i = 0; i < syms; i++)
|
||||
{
|
||||
GElf_Sym sym_mem;
|
||||
@@ -938,7 +939,7 @@ process_file (const char *fname)
|
||||
error (0, 0, "Couldn't get symbol %zd name", i);
|
||||
return cleanup (-1);
|
||||
}
|
||||
symstrents[i] = ebl_strtabadd (names, symname, 0);
|
||||
symstrents[i] = dwelf_strtab_add (names, symname);
|
||||
if (symstrents[i] == NULL)
|
||||
{
|
||||
error (0, 0, "No memory to add to symbol name");
|
||||
@@ -970,7 +971,11 @@ process_file (const char *fname)
|
||||
error (0, 0, "Couldn't create new section header string table data");
|
||||
return cleanup (-1);
|
||||
}
|
||||
ebl_strtabfinalize (names, data);
|
||||
if (dwelf_strtab_finalize (names, data) == NULL)
|
||||
{
|
||||
error (0, 0, "Not enough memory to create string table");
|
||||
return cleanup (-1);
|
||||
}
|
||||
namesbuf = data->d_buf;
|
||||
|
||||
GElf_Shdr shdr_mem;
|
||||
@@ -984,7 +989,7 @@ process_file (const char *fname)
|
||||
|
||||
/* Note that we also might have to compress and possibly set
|
||||
sh_off below */
|
||||
shdr->sh_name = ebl_strtaboffset (scnstrents[shdrstrndx]);
|
||||
shdr->sh_name = dwelf_strent_off (scnstrents[shdrstrndx]);
|
||||
shdr->sh_type = SHT_STRTAB;
|
||||
shdr->sh_flags = 0;
|
||||
shdr->sh_addr = 0;
|
||||
@@ -1099,7 +1104,7 @@ process_file (const char *fname)
|
||||
}
|
||||
|
||||
if (adjust_names)
|
||||
shdr->sh_name = ebl_strtaboffset (scnstrents[ndx]);
|
||||
shdr->sh_name = dwelf_strent_off (scnstrents[ndx]);
|
||||
|
||||
if (gelf_update_shdr (scn, shdr) == 0)
|
||||
{
|
||||
@@ -1133,7 +1138,7 @@ process_file (const char *fname)
|
||||
|
||||
if (sym->st_name != 0)
|
||||
{
|
||||
sym->st_name = ebl_strtaboffset (symstrents[i]);
|
||||
sym->st_name = dwelf_strent_off (symstrents[i]);
|
||||
|
||||
if (gelf_update_sym (symd, i, sym) == 0)
|
||||
{
|
||||
|
||||
+15
-9
@@ -42,6 +42,7 @@
|
||||
|
||||
#include <elf-knowledge.h>
|
||||
#include <libebl.h>
|
||||
#include "libdwelf.h"
|
||||
#include <system.h>
|
||||
|
||||
typedef uint8_t GElf_Byte;
|
||||
@@ -432,7 +433,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
|
||||
Elf32_Word group_idx;
|
||||
Elf32_Word group_cnt;
|
||||
Elf_Scn *newscn;
|
||||
struct Ebl_Strent *se;
|
||||
Dwelf_Strent *se;
|
||||
Elf32_Word *newsymidx;
|
||||
} *shdr_info = NULL;
|
||||
Elf_Scn *scn;
|
||||
@@ -443,7 +444,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
|
||||
GElf_Ehdr *newehdr;
|
||||
GElf_Ehdr debugehdr_mem;
|
||||
GElf_Ehdr *debugehdr;
|
||||
struct Ebl_Strtab *shst = NULL;
|
||||
Dwelf_Strtab *shst = NULL;
|
||||
Elf_Data debuglink_crc_data;
|
||||
bool any_symtab_changes = false;
|
||||
Elf_Data *shstrtab_data = NULL;
|
||||
@@ -1043,7 +1044,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
|
||||
will already be marked as unused. */
|
||||
|
||||
/* We need a string table for the section headers. */
|
||||
shst = ebl_strtabinit (true);
|
||||
shst = dwelf_strtab_init (true);
|
||||
if (shst == NULL)
|
||||
{
|
||||
cleanup_debug ();
|
||||
@@ -1071,7 +1072,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
|
||||
elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
|
||||
|
||||
/* Add this name to the section header string table. */
|
||||
shdr_info[cnt].se = ebl_strtabadd (shst, shdr_info[cnt].name, 0);
|
||||
shdr_info[cnt].se = dwelf_strtab_add (shst, shdr_info[cnt].name);
|
||||
}
|
||||
|
||||
/* Test whether we are doing anything at all. */
|
||||
@@ -1083,7 +1084,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
|
||||
if (debug_fname != NULL && !remove_shdrs)
|
||||
{
|
||||
/* Add the section header string table section name. */
|
||||
shdr_info[cnt].se = ebl_strtabadd (shst, ".gnu_debuglink", 15);
|
||||
shdr_info[cnt].se = dwelf_strtab_add_len (shst, ".gnu_debuglink", 15);
|
||||
shdr_info[cnt].idx = idx++;
|
||||
|
||||
/* Create the section header. */
|
||||
@@ -1146,7 +1147,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
|
||||
shdridx = cnt;
|
||||
|
||||
/* Add the section header string table section name. */
|
||||
shdr_info[cnt].se = ebl_strtabadd (shst, ".shstrtab", 10);
|
||||
shdr_info[cnt].se = dwelf_strtab_add_len (shst, ".shstrtab", 10);
|
||||
shdr_info[cnt].idx = idx;
|
||||
|
||||
/* Create the section header. */
|
||||
@@ -1183,7 +1184,12 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
|
||||
gettext ("while create section header string table: %s"),
|
||||
elf_errmsg (-1));
|
||||
}
|
||||
ebl_strtabfinalize (shst, shstrtab_data);
|
||||
if (dwelf_strtab_finalize (shst, shstrtab_data) == NULL)
|
||||
{
|
||||
cleanup_debug ();
|
||||
error (EXIT_FAILURE, 0,
|
||||
gettext ("no memory to create section header string table"));
|
||||
}
|
||||
|
||||
/* We have to set the section size. */
|
||||
shdr_info[cnt].shdr.sh_size = shstrtab_data->d_size;
|
||||
@@ -1199,7 +1205,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
|
||||
elf_assert (scn != NULL);
|
||||
|
||||
/* Update the name. */
|
||||
shdr_info[cnt].shdr.sh_name = ebl_strtaboffset (shdr_info[cnt].se);
|
||||
shdr_info[cnt].shdr.sh_name = dwelf_strent_off (shdr_info[cnt].se);
|
||||
|
||||
/* Update the section header from the input file. Some fields
|
||||
might be section indeces which now have to be adjusted. */
|
||||
@@ -2171,7 +2177,7 @@ while computing checksum for debug information"));
|
||||
if (shstrtab_data != NULL)
|
||||
free (shstrtab_data->d_buf);
|
||||
if (shst != NULL)
|
||||
ebl_strtabfree (shst);
|
||||
dwelf_strtab_free (shst);
|
||||
|
||||
/* That was it. Close the descriptors. */
|
||||
if (elf_end (newelf) != 0)
|
||||
|
||||
+27
-23
@@ -48,6 +48,7 @@
|
||||
#include <gelf.h>
|
||||
#include <libebl.h>
|
||||
#include <libdwfl.h>
|
||||
#include "libdwelf.h"
|
||||
#include "system.h"
|
||||
|
||||
#ifndef _
|
||||
@@ -686,7 +687,7 @@ struct section
|
||||
Elf_Scn *scn;
|
||||
const char *name;
|
||||
Elf_Scn *outscn;
|
||||
struct Ebl_Strent *strent;
|
||||
Dwelf_Strent *strent;
|
||||
GElf_Shdr shdr;
|
||||
};
|
||||
|
||||
@@ -757,7 +758,7 @@ struct symbol
|
||||
union
|
||||
{
|
||||
const char *name;
|
||||
struct Ebl_Strent *strent;
|
||||
Dwelf_Strent *strent;
|
||||
};
|
||||
union
|
||||
{
|
||||
@@ -1214,12 +1215,12 @@ static Elf_Data *
|
||||
new_shstrtab (Elf *unstripped, size_t unstripped_shnum,
|
||||
Elf_Data *shstrtab, size_t unstripped_shstrndx,
|
||||
struct section *sections, size_t stripped_shnum,
|
||||
struct Ebl_Strtab *strtab)
|
||||
Dwelf_Strtab *strtab)
|
||||
{
|
||||
if (strtab == NULL)
|
||||
return NULL;
|
||||
|
||||
struct Ebl_Strent *unstripped_strent[unstripped_shnum - 1];
|
||||
Dwelf_Strent *unstripped_strent[unstripped_shnum - 1];
|
||||
memset (unstripped_strent, 0, sizeof unstripped_strent);
|
||||
for (struct section *sec = sections;
|
||||
sec < §ions[stripped_shnum - 1];
|
||||
@@ -1228,7 +1229,7 @@ new_shstrtab (Elf *unstripped, size_t unstripped_shnum,
|
||||
{
|
||||
if (sec->strent == NULL)
|
||||
{
|
||||
sec->strent = ebl_strtabadd (strtab, sec->name, 0);
|
||||
sec->strent = dwelf_strtab_add (strtab, sec->name);
|
||||
ELF_CHECK (sec->strent != NULL,
|
||||
_("cannot add section name to string table: %s"));
|
||||
}
|
||||
@@ -1243,7 +1244,7 @@ new_shstrtab (Elf *unstripped, size_t unstripped_shnum,
|
||||
GElf_Shdr shdr_mem;
|
||||
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
|
||||
const char *name = get_section_name (i + 1, shdr, shstrtab);
|
||||
unstripped_strent[i] = ebl_strtabadd (strtab, name, 0);
|
||||
unstripped_strent[i] = dwelf_strtab_add (strtab, name);
|
||||
ELF_CHECK (unstripped_strent[i] != NULL,
|
||||
_("cannot add section name to string table: %s"));
|
||||
}
|
||||
@@ -1255,7 +1256,8 @@ new_shstrtab (Elf *unstripped, size_t unstripped_shnum,
|
||||
unstripped_shstrndx), NULL);
|
||||
ELF_CHECK (elf_flagdata (strtab_data, ELF_C_SET, ELF_F_DIRTY),
|
||||
_("cannot update section header string table data: %s"));
|
||||
ebl_strtabfinalize (strtab, strtab_data);
|
||||
if (dwelf_strtab_finalize (strtab, strtab_data) == NULL)
|
||||
error (EXIT_FAILURE, 0, "Not enough memory to create string table");
|
||||
|
||||
/* Update the sh_name fields of sections we aren't modifying later. */
|
||||
for (size_t i = 0; i < unstripped_shnum - 1; ++i)
|
||||
@@ -1264,7 +1266,7 @@ new_shstrtab (Elf *unstripped, size_t unstripped_shnum,
|
||||
Elf_Scn *scn = elf_getscn (unstripped, i + 1);
|
||||
GElf_Shdr shdr_mem;
|
||||
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
|
||||
shdr->sh_name = ebl_strtaboffset (unstripped_strent[i]);
|
||||
shdr->sh_name = dwelf_strent_off (unstripped_strent[i]);
|
||||
if (i + 1 == unstripped_shstrndx)
|
||||
shdr->sh_size = strtab_data->d_size;
|
||||
update_shdr (scn, shdr);
|
||||
@@ -1456,7 +1458,7 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
const struct section *stripped_dynsym = NULL;
|
||||
size_t debuglink = SHN_UNDEF;
|
||||
size_t ndx_section[stripped_shnum - 1];
|
||||
struct Ebl_Strtab *strtab = NULL;
|
||||
Dwelf_Strtab *strtab = NULL;
|
||||
for (struct section *sec = sections;
|
||||
sec < §ions[stripped_shnum - 1];
|
||||
++sec)
|
||||
@@ -1508,8 +1510,8 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
_("cannot add new section: %s"));
|
||||
|
||||
if (strtab == NULL)
|
||||
strtab = ebl_strtabinit (true);
|
||||
sec->strent = ebl_strtabadd (strtab, sec->name, 0);
|
||||
strtab = dwelf_strtab_init (true);
|
||||
sec->strent = dwelf_strtab_add (strtab, sec->name);
|
||||
ELF_CHECK (sec->strent != NULL,
|
||||
_("cannot add section name to string table: %s"));
|
||||
}
|
||||
@@ -1570,7 +1572,7 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
shdr_mem.sh_info = ndx_section[sec->shdr.sh_info - 1];
|
||||
|
||||
if (strtab != NULL)
|
||||
shdr_mem.sh_name = ebl_strtaboffset (sec->strent);
|
||||
shdr_mem.sh_name = dwelf_strent_off (sec->strent);
|
||||
|
||||
Elf_Data *indata = elf_getdata (sec->scn, NULL);
|
||||
ELF_CHECK (indata != NULL, _("cannot get section data: %s"));
|
||||
@@ -1641,7 +1643,7 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
|
||||
/* We may need to update the symbol table. */
|
||||
Elf_Data *symdata = NULL;
|
||||
struct Ebl_Strtab *symstrtab = NULL;
|
||||
Dwelf_Strtab *symstrtab = NULL;
|
||||
Elf_Data *symstrdata = NULL;
|
||||
if (unstripped_symtab != NULL && (stripped_symtab != NULL
|
||||
|| check_prelink /* Section adjustments. */
|
||||
@@ -1721,13 +1723,13 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
|
||||
/* Now a final pass updates the map with the final order,
|
||||
and builds up the new string table. */
|
||||
symstrtab = ebl_strtabinit (true);
|
||||
symstrtab = dwelf_strtab_init (true);
|
||||
for (size_t i = 0; i < nsym; ++i)
|
||||
{
|
||||
assert (symbols[i].name != NULL);
|
||||
assert (*symbols[i].map != 0);
|
||||
*symbols[i].map = 1 + i;
|
||||
symbols[i].strent = ebl_strtabadd (symstrtab, symbols[i].name, 0);
|
||||
symbols[i].strent = dwelf_strtab_add (symstrtab, symbols[i].name);
|
||||
}
|
||||
|
||||
/* Scan the discarded symbols too, just to update their slots
|
||||
@@ -1752,7 +1754,7 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
/* If symtab and the section header table share the string table
|
||||
add the section names to the strtab and then (after finalizing)
|
||||
fixup the section header sh_names. Also dispose of the old data. */
|
||||
struct Ebl_Strent *unstripped_strent[unstripped_shnum - 1];
|
||||
Dwelf_Strent *unstripped_strent[unstripped_shnum - 1];
|
||||
if (unstripped_shstrndx == elf_ndxscn (unstripped_strtab))
|
||||
{
|
||||
for (size_t i = 0; i < unstripped_shnum - 1; ++i)
|
||||
@@ -1761,20 +1763,22 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
GElf_Shdr mem;
|
||||
GElf_Shdr *hdr = gelf_getshdr (sec, &mem);
|
||||
const char *name = get_section_name (i + 1, hdr, shstrtab);
|
||||
unstripped_strent[i] = ebl_strtabadd (symstrtab, name, 0);
|
||||
unstripped_strent[i] = dwelf_strtab_add (symstrtab, name);
|
||||
ELF_CHECK (unstripped_strent[i] != NULL,
|
||||
_("cannot add section name to string table: %s"));
|
||||
}
|
||||
|
||||
if (strtab != NULL)
|
||||
{
|
||||
ebl_strtabfree (strtab);
|
||||
dwelf_strtab_free (strtab);
|
||||
free (strtab_data->d_buf);
|
||||
strtab = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ebl_strtabfinalize (symstrtab, symstrdata);
|
||||
if (dwelf_strtab_finalize (symstrtab, symstrdata) == NULL)
|
||||
error (EXIT_FAILURE, 0, "Not enough memory to create symbol table");
|
||||
|
||||
elf_flagdata (symstrdata, ELF_C_SET, ELF_F_DIRTY);
|
||||
|
||||
/* And update the section header names if necessary. */
|
||||
@@ -1785,7 +1789,7 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
Elf_Scn *sec = elf_getscn (unstripped, i + 1);
|
||||
GElf_Shdr mem;
|
||||
GElf_Shdr *hdr = gelf_getshdr (sec, &mem);
|
||||
shdr->sh_name = ebl_strtaboffset (unstripped_strent[i]);
|
||||
shdr->sh_name = dwelf_strent_off (unstripped_strent[i]);
|
||||
update_shdr (sec, hdr);
|
||||
}
|
||||
}
|
||||
@@ -1810,7 +1814,7 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
struct symbol *s = &symbols[i];
|
||||
|
||||
/* Fill in the symbol details. */
|
||||
sym.st_name = ebl_strtaboffset (s->strent);
|
||||
sym.st_name = dwelf_strent_off (s->strent);
|
||||
sym.st_value = s->value; /* Already biased to output address. */
|
||||
sym.st_size = s->size;
|
||||
sym.st_shndx = s->shndx; /* Already mapped to output index. */
|
||||
@@ -1959,13 +1963,13 @@ more sections in stripped file than debug file -- arguments reversed?"));
|
||||
|
||||
if (strtab != NULL)
|
||||
{
|
||||
ebl_strtabfree (strtab);
|
||||
dwelf_strtab_free (strtab);
|
||||
free (strtab_data->d_buf);
|
||||
}
|
||||
|
||||
if (symstrtab != NULL)
|
||||
{
|
||||
ebl_strtabfree (symstrtab);
|
||||
dwelf_strtab_free (symstrtab);
|
||||
free (symstrdata->d_buf);
|
||||
}
|
||||
free_new_data ();
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
2016-07-08 Mark Wielaard <mjw@redhat.com>
|
||||
|
||||
* update3_LDADD: Use libdw instead of libebl.
|
||||
* update4_LDADD: Likewise.
|
||||
* alldts_LDADD: Likewise.
|
||||
* elfstrmerge_LDADD: Likewise.
|
||||
* alldts.c (main): Use dwelf_strtab instead of ebl_strtab.
|
||||
* elfstrmerge.c (release): Likewise.
|
||||
(main): Likewise.
|
||||
* update3.c (main): Likewise.
|
||||
* update4.c (main): Likewise.
|
||||
|
||||
2016-07-10 Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
* Makefile.am (TESTS): Add run-strip-test11.sh.
|
||||
|
||||
+4
-4
@@ -406,8 +406,8 @@ early_offscn_LDADD = $(libelf)
|
||||
ecp_LDADD = $(libelf)
|
||||
update1_LDADD = $(libelf)
|
||||
update2_LDADD = $(libelf)
|
||||
update3_LDADD = $(libebl) $(libelf)
|
||||
update4_LDADD = $(libebl) $(libelf)
|
||||
update3_LDADD = $(libdw) $(libelf)
|
||||
update4_LDADD = $(libdw) $(libelf)
|
||||
show_die_info_LDADD = $(libdw) $(libelf)
|
||||
get_pubnames_LDADD = $(libdw) $(libelf)
|
||||
show_abbrev_LDADD = $(libdw) $(libelf)
|
||||
@@ -445,7 +445,7 @@ dwarf_getstring_LDADD = $(libdw)
|
||||
addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(argp_LDADD) -ldl
|
||||
test_flag_nobits_LDADD = $(libelf)
|
||||
rerequest_tag_LDADD = $(libdw)
|
||||
alldts_LDADD = $(libebl) $(libelf)
|
||||
alldts_LDADD = $(libdw) $(libelf)
|
||||
md5_sha1_test_LDADD = $(libeu)
|
||||
typeiter_LDADD = $(libdw) $(libelf)
|
||||
typeiter2_LDADD = $(libdw) $(libelf)
|
||||
@@ -478,7 +478,7 @@ elfstrtab_LDADD = $(libelf)
|
||||
dwfl_proc_attach_LDADD = $(libdw)
|
||||
dwfl_proc_attach_LDFLAGS = -pthread $(AM_LDFLAGS)
|
||||
elfshphehdr_LDADD =$(libelf)
|
||||
elfstrmerge_LDADD = $(libebl) $(libelf)
|
||||
elfstrmerge_LDADD = $(libdw) $(libelf)
|
||||
dwelfgnucompressed_LDADD = $(libelf) $(libdw)
|
||||
elfgetchdr_LDADD = $(libelf) $(libdw)
|
||||
elfgetzdata_LDADD = $(libelf)
|
||||
|
||||
+12
-12
@@ -1,5 +1,5 @@
|
||||
/* Create an ELF file with all the DT_* flags set.
|
||||
Copyright (C) 2011 Red Hat, Inc.
|
||||
Copyright (C) 2011, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Marek Polacek <mpolacek@redhat.com>, 2011.
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include ELFUTILS_HEADER(ebl)
|
||||
#include ELFUTILS_HEADER(dwelf)
|
||||
#include <elf.h>
|
||||
#include <gelf.h>
|
||||
#include <fcntl.h>
|
||||
@@ -38,9 +38,9 @@ int
|
||||
main (void)
|
||||
{
|
||||
static const char fname[] = "testfile-alldts";
|
||||
struct Ebl_Strtab *shst;
|
||||
struct Ebl_Strent *dynscn;
|
||||
struct Ebl_Strent *shstrtabse;
|
||||
Dwelf_Strtab *shst;
|
||||
Dwelf_Strent *dynscn;
|
||||
Dwelf_Strent *shstrtabse;
|
||||
const Elf32_Sword dtflags[] =
|
||||
{
|
||||
DT_NULL, DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT,
|
||||
@@ -117,7 +117,7 @@ main (void)
|
||||
phdr[1].p_type = PT_DYNAMIC;
|
||||
|
||||
elf_flagphdr (elf, ELF_C_SET, ELF_F_DIRTY);
|
||||
shst = ebl_strtabinit (true);
|
||||
shst = dwelf_strtab_init (true);
|
||||
|
||||
/* Create the .dynamic section. */
|
||||
Elf_Scn *scn = elf_newscn (elf);
|
||||
@@ -134,7 +134,7 @@ main (void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
dynscn = ebl_strtabadd (shst, ".dynamic", 0);
|
||||
dynscn = dwelf_strtab_add (shst, ".dynamic");
|
||||
|
||||
/* We'll need to know the section offset. But this will be set up
|
||||
by elf_update later, so for now just store the address. */
|
||||
@@ -191,7 +191,7 @@ main (void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
shstrtabse = ebl_strtabadd (shst, ".shstrtab", 0);
|
||||
shstrtabse = dwelf_strtab_add (shst, ".shstrtab");
|
||||
|
||||
shdr->sh_type = SHT_STRTAB;
|
||||
shdr->sh_flags = 0;
|
||||
@@ -211,10 +211,10 @@ main (void)
|
||||
}
|
||||
|
||||
/* No more sections, finalize the section header string table. */
|
||||
ebl_strtabfinalize (shst, data);
|
||||
dwelf_strtab_finalize (shst, data);
|
||||
|
||||
elf32_getshdr (elf_getscn (elf, 1))->sh_name = ebl_strtaboffset (dynscn);
|
||||
shdr->sh_name = ebl_strtaboffset (shstrtabse);
|
||||
elf32_getshdr (elf_getscn (elf, 1))->sh_name = dwelf_strent_off (dynscn);
|
||||
shdr->sh_name = dwelf_strent_off (shstrtabse);
|
||||
|
||||
/* Let the library compute the internal structure information. */
|
||||
if (elf_update (elf, ELF_C_NULL) < 0)
|
||||
@@ -251,7 +251,7 @@ main (void)
|
||||
}
|
||||
|
||||
/* We don't need the string table anymore. */
|
||||
ebl_strtabfree (shst);
|
||||
dwelf_strtab_free (shst);
|
||||
|
||||
/* And the data allocated in the .shstrtab section. */
|
||||
free (data->d_buf);
|
||||
|
||||
+16
-15
@@ -1,5 +1,5 @@
|
||||
/* Merge string sections.
|
||||
Copyright (C) 2015 Red Hat, Inc.
|
||||
Copyright (C) 2015, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify
|
||||
@@ -30,7 +30,8 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include <gelf.h>
|
||||
#include ELFUTILS_HEADER(ebl)
|
||||
#include ELFUTILS_HEADER(dwelf)
|
||||
#include "elf-knowledge.h"
|
||||
|
||||
/* The original ELF file. */
|
||||
static int fd = -1;
|
||||
@@ -43,13 +44,13 @@ static int fdnew = -1;
|
||||
static Elf *elfnew = NULL;
|
||||
|
||||
/* The merged string table. */
|
||||
static struct Ebl_Strtab *strings = NULL;
|
||||
static Dwelf_Strtab *strings = NULL;
|
||||
|
||||
/* Section name strents. */
|
||||
static struct Ebl_Strent **scnstrents = NULL;
|
||||
static Dwelf_Strent **scnstrents = NULL;
|
||||
|
||||
/* Symbol name strends. */
|
||||
static struct Ebl_Strent **symstrents = NULL;
|
||||
static Dwelf_Strent **symstrents = NULL;
|
||||
|
||||
/* New ELF file buffers. */
|
||||
static Elf_Data newstrtabdata = { .d_buf = NULL };
|
||||
@@ -62,7 +63,7 @@ release (void)
|
||||
{
|
||||
/* The new string table. */
|
||||
if (strings != NULL)
|
||||
ebl_strtabfree (strings);
|
||||
dwelf_strtab_free (strings);
|
||||
|
||||
free (scnstrents);
|
||||
free (symstrents);
|
||||
@@ -241,7 +242,7 @@ main (int argc, char **argv)
|
||||
bool layout = phnum != 0;
|
||||
|
||||
/* Create a new merged strings table that starts with the empty string. */
|
||||
strings = ebl_strtabinit (true);
|
||||
strings = dwelf_strtab_init (true);
|
||||
if (strings == NULL)
|
||||
fail ("No memory to create merged string table", NULL);
|
||||
|
||||
@@ -249,7 +250,7 @@ main (int argc, char **argv)
|
||||
size_t shdrnum;
|
||||
if (elf_getshdrnum (elf, &shdrnum) != 0)
|
||||
fail_elf ("Couldn't get number of sections", fname);
|
||||
scnstrents = malloc (shdrnum * sizeof (struct Ebl_Strent *));
|
||||
scnstrents = malloc (shdrnum * sizeof (Dwelf_Strent *));
|
||||
if (scnstrents == NULL)
|
||||
fail ("couldn't allocate memory for section strings", NULL);
|
||||
|
||||
@@ -275,8 +276,8 @@ main (int argc, char **argv)
|
||||
const char *sname = elf_strptr (elf, shdrstrndx, shdr->sh_name);
|
||||
if (sname == NULL)
|
||||
fail_elf_idx ("couldn't get section name", fname, scnnum);
|
||||
if ((scnstrents[scnnum] = ebl_strtabadd (strings, sname, 0)) == NULL)
|
||||
fail ("No memory to add to merged string table", NULL);
|
||||
if ((scnstrents[scnnum] = dwelf_strtab_add (strings, sname)) == NULL)
|
||||
fail ("No memory to add to merged string table", NULL);
|
||||
}
|
||||
|
||||
if (layout)
|
||||
@@ -295,7 +296,7 @@ main (int argc, char **argv)
|
||||
if (symd == NULL)
|
||||
fail_elf ("couldn't get symtab data", fname);
|
||||
size_t symsnum = symd->d_size / elsize;
|
||||
symstrents = malloc (symsnum * sizeof (struct Ebl_Strent *));
|
||||
symstrents = malloc (symsnum * sizeof (Dwelf_Strent *));
|
||||
if (symstrents == NULL)
|
||||
fail_errno ("Couldn't allocate memory for symbol strings", NULL);
|
||||
for (size_t i = 0; i < symsnum; i++)
|
||||
@@ -309,7 +310,7 @@ main (int argc, char **argv)
|
||||
const char *sname = elf_strptr (elf, strtabndx, sym->st_name);
|
||||
if (sname == NULL)
|
||||
fail_elf_idx ("Couldn't get symbol name", fname, i);
|
||||
if ((symstrents[i] = ebl_strtabadd (strings, sname, 0)) == NULL)
|
||||
if ((symstrents[i] = dwelf_strtab_add (strings, sname)) == NULL)
|
||||
fail_idx ("No memory to add to merged string table symbol",
|
||||
fname, i);
|
||||
}
|
||||
@@ -317,7 +318,7 @@ main (int argc, char **argv)
|
||||
|
||||
/* We got all strings, build the new string table and store it as
|
||||
new strtab. */
|
||||
ebl_strtabfinalize (strings, &newstrtabdata);
|
||||
dwelf_strtab_finalize (strings, &newstrtabdata);
|
||||
|
||||
/* We share at least the empty string so the result is at least 1
|
||||
byte smaller. */
|
||||
@@ -453,7 +454,7 @@ main (int argc, char **argv)
|
||||
|
||||
GElf_Shdr newshdr;
|
||||
newshdr.sh_name = (shdr->sh_name != 0
|
||||
? ebl_strtaboffset (scnstrents[ndx]) : 0);
|
||||
? dwelf_strent_off (scnstrents[ndx]) : 0);
|
||||
newshdr.sh_type = shdr->sh_type;
|
||||
newshdr.sh_flags = shdr->sh_flags;
|
||||
newshdr.sh_addr = shdr->sh_addr;
|
||||
@@ -528,7 +529,7 @@ main (int argc, char **argv)
|
||||
sym.st_shndx = newsecndx (sym.st_shndx, "section", ndx,
|
||||
"symbol", i);
|
||||
if (update_name && sym.st_name != 0)
|
||||
sym.st_name = ebl_strtaboffset (symstrents[i]);
|
||||
sym.st_name = dwelf_strent_off (symstrents[i]);
|
||||
|
||||
/* We explicitly don't update the SHNDX table at
|
||||
the same time, we do that below. */
|
||||
|
||||
+9
-9
@@ -1,5 +1,5 @@
|
||||
/* Test program for elf_update function.
|
||||
Copyright (C) 2000, 2002, 2005 Red Hat, Inc.
|
||||
Copyright (C) 2000, 2002, 2005, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include ELFUTILS_HEADER(ebl)
|
||||
#include ELFUTILS_HEADER(dwelf)
|
||||
|
||||
|
||||
int
|
||||
@@ -42,8 +42,8 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
Elf_Scn *scn;
|
||||
Elf32_Shdr *shdr;
|
||||
Elf_Data *data;
|
||||
struct Ebl_Strtab *shst;
|
||||
struct Ebl_Strent *shstrtabse;
|
||||
Dwelf_Strtab *shst;
|
||||
Dwelf_Strent *shstrtabse;
|
||||
int i;
|
||||
|
||||
fd = open (fname, O_RDWR | O_CREAT | O_TRUNC, 0666);
|
||||
@@ -107,7 +107,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
phdr[0].p_type = PT_PHDR;
|
||||
elf_flagphdr (elf, ELF_C_SET, ELF_F_DIRTY);
|
||||
|
||||
shst = ebl_strtabinit (true);
|
||||
shst = dwelf_strtab_init (true);
|
||||
|
||||
scn = elf_newscn (elf);
|
||||
if (scn == NULL)
|
||||
@@ -122,7 +122,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
exit (1);
|
||||
}
|
||||
|
||||
shstrtabse = ebl_strtabadd (shst, ".shstrtab", 0);
|
||||
shstrtabse = dwelf_strtab_add (shst, ".shstrtab");
|
||||
|
||||
shdr->sh_type = SHT_STRTAB;
|
||||
shdr->sh_flags = 0;
|
||||
@@ -143,9 +143,9 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
}
|
||||
|
||||
/* No more sections, finalize the section header string table. */
|
||||
ebl_strtabfinalize (shst, data);
|
||||
dwelf_strtab_finalize (shst, data);
|
||||
|
||||
shdr->sh_name = ebl_strtaboffset (shstrtabse);
|
||||
shdr->sh_name = dwelf_strent_off (shstrtabse);
|
||||
|
||||
/* Let the library compute the internal structure information. */
|
||||
if (elf_update (elf, ELF_C_NULL) < 0)
|
||||
@@ -173,7 +173,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
}
|
||||
|
||||
/* We don't need the string table anymore. */
|
||||
ebl_strtabfree (shst);
|
||||
dwelf_strtab_free (shst);
|
||||
|
||||
/* And the data allocated in the .shstrtab section. */
|
||||
free (data->d_buf);
|
||||
|
||||
+21
-21
@@ -1,5 +1,5 @@
|
||||
/* Test program for elf_update function.
|
||||
Copyright (C) 2000, 2001, 2002, 2005 Red Hat, Inc.
|
||||
Copyright (C) 2000, 2001, 2002, 2005, 2016 Red Hat, Inc.
|
||||
This file is part of elfutils.
|
||||
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include ELFUTILS_HEADER(ebl)
|
||||
#include ELFUTILS_HEADER(dwelf)
|
||||
|
||||
|
||||
int
|
||||
@@ -42,12 +42,12 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
Elf_Scn *scn;
|
||||
Elf32_Shdr *shdr;
|
||||
Elf_Data *data;
|
||||
struct Ebl_Strtab *shst;
|
||||
struct Ebl_Strent *firstse;
|
||||
struct Ebl_Strent *secondse;
|
||||
struct Ebl_Strent *thirdse;
|
||||
struct Ebl_Strent *fourthse;
|
||||
struct Ebl_Strent *shstrtabse;
|
||||
Dwelf_Strtab *shst;
|
||||
Dwelf_Strent *firstse;
|
||||
Dwelf_Strent *secondse;
|
||||
Dwelf_Strent *thirdse;
|
||||
Dwelf_Strent *fourthse;
|
||||
Dwelf_Strent *shstrtabse;
|
||||
int i;
|
||||
|
||||
fd = open (fname, O_RDWR | O_CREAT | O_TRUNC, 0666);
|
||||
@@ -111,7 +111,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
phdr[0].p_type = PT_PHDR;
|
||||
elf_flagphdr (elf, ELF_C_SET, ELF_F_DIRTY);
|
||||
|
||||
shst = ebl_strtabinit (true);
|
||||
shst = dwelf_strtab_init (true);
|
||||
|
||||
scn = elf_newscn (elf);
|
||||
if (scn == NULL)
|
||||
@@ -126,7 +126,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
exit (1);
|
||||
}
|
||||
|
||||
firstse = ebl_strtabadd (shst, ".first", 0);
|
||||
firstse = dwelf_strtab_add (shst, ".first");
|
||||
|
||||
shdr->sh_type = SHT_PROGBITS;
|
||||
shdr->sh_flags = SHF_ALLOC | SHF_EXECINSTR;
|
||||
@@ -162,7 +162,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
exit (1);
|
||||
}
|
||||
|
||||
secondse = ebl_strtabadd (shst, ".second", 0);
|
||||
secondse = dwelf_strtab_add (shst, ".second");
|
||||
|
||||
shdr->sh_type = SHT_PROGBITS;
|
||||
shdr->sh_flags = SHF_ALLOC | SHF_WRITE;
|
||||
@@ -198,7 +198,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
exit (1);
|
||||
}
|
||||
|
||||
thirdse = ebl_strtabadd (shst, ".third", 0);
|
||||
thirdse = dwelf_strtab_add (shst, ".third");
|
||||
|
||||
shdr->sh_type = SHT_PROGBITS;
|
||||
shdr->sh_flags = SHF_ALLOC | SHF_EXECINSTR;
|
||||
@@ -234,7 +234,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
exit (1);
|
||||
}
|
||||
|
||||
fourthse = ebl_strtabadd (shst, ".fourth", 0);
|
||||
fourthse = dwelf_strtab_add (shst, ".fourth");
|
||||
|
||||
shdr->sh_type = SHT_NOBITS;
|
||||
shdr->sh_flags = SHF_ALLOC | SHF_EXECINSTR;
|
||||
@@ -271,7 +271,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
exit (1);
|
||||
}
|
||||
|
||||
shstrtabse = ebl_strtabadd (shst, ".shstrtab", 0);
|
||||
shstrtabse = dwelf_strtab_add (shst, ".shstrtab");
|
||||
|
||||
shdr->sh_type = SHT_STRTAB;
|
||||
shdr->sh_flags = 0;
|
||||
@@ -291,13 +291,13 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
}
|
||||
|
||||
/* No more sections, finalize the section header string table. */
|
||||
ebl_strtabfinalize (shst, data);
|
||||
dwelf_strtab_finalize (shst, data);
|
||||
|
||||
elf32_getshdr (elf_getscn (elf, 1))->sh_name = ebl_strtaboffset (firstse);
|
||||
elf32_getshdr (elf_getscn (elf, 2))->sh_name = ebl_strtaboffset (secondse);
|
||||
elf32_getshdr (elf_getscn (elf, 3))->sh_name = ebl_strtaboffset (thirdse);
|
||||
elf32_getshdr (elf_getscn (elf, 4))->sh_name = ebl_strtaboffset (fourthse);
|
||||
shdr->sh_name = ebl_strtaboffset (shstrtabse);
|
||||
elf32_getshdr (elf_getscn (elf, 1))->sh_name = dwelf_strent_off (firstse);
|
||||
elf32_getshdr (elf_getscn (elf, 2))->sh_name = dwelf_strent_off (secondse);
|
||||
elf32_getshdr (elf_getscn (elf, 3))->sh_name = dwelf_strent_off (thirdse);
|
||||
elf32_getshdr (elf_getscn (elf, 4))->sh_name = dwelf_strent_off (fourthse);
|
||||
shdr->sh_name = dwelf_strent_off (shstrtabse);
|
||||
|
||||
/* Let the library compute the internal structure information. */
|
||||
if (elf_update (elf, ELF_C_NULL) < 0)
|
||||
@@ -325,7 +325,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
|
||||
}
|
||||
|
||||
/* We don't need the string table anymore. */
|
||||
ebl_strtabfree (shst);
|
||||
dwelf_strtab_free (shst);
|
||||
|
||||
/* And the data allocated in the .shstrtab section. */
|
||||
free (data->d_buf);
|
||||
|
||||
Reference in New Issue
Block a user