#include <assert.h>
#include <byteswap.h>
#include <endian.h>
#include <errno.h>
#include <error.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <popt.h>
#include <gelf.h>
#include <dwarf.h>
#include "hashtab.h"
Go to the source code of this file.
Data Structures | |
struct | DSO |
struct | REL |
struct | abbrev_attr |
struct | abbrev_tag |
Defines | |
#define | _FILE_OFFSET_BITS 64 |
#define | DW_TAG_partial_unit 0x3c |
#define | read_uleb128(ptr) |
#define | read_1(ptr) *ptr++ |
#define | read_16(ptr) |
#define | read_32(ptr) |
#define | do_read_32_relocated(ptr) |
#define | read_32_relocated(ptr) |
#define | DEBUG_INFO 0 |
#define | DEBUG_ABBREV 1 |
#define | DEBUG_LINE 2 |
#define | DEBUG_ARANGES 3 |
#define | DEBUG_PUBNAMES 4 |
#define | DEBUG_MACINFO 5 |
#define | DEBUG_LOC 6 |
#define | DEBUG_STR 7 |
#define | DEBUG_FRAME 8 |
#define | DEBUG_RANGES 9 |
#define | IS_DIR_SEPARATOR(c) ((c)=='/') |
Typedefs | |
typedef unsigned int | uint_32 |
typedef unsigned short | uint_16 |
Functions | |
static uint_16 | buf_read_ule16 (unsigned char *data) |
static uint_16 | buf_read_ube16 (unsigned char *data) |
static uint_32 | buf_read_ule32 (unsigned char *data) |
static uint_32 | buf_read_ube32 (unsigned char *data) |
static const char * | strptr (DSO *dso, int sec, off_t offset) |
static void | dwarf2_write_le32 (unsigned char *p, GElf_Addr val) |
static void | dwarf2_write_be32 (unsigned char *p, GElf_Addr val) |
static hashval_t | abbrev_hash (const void *p) |
static int | abbrev_eq (const void *p, const void *q) |
static void | abbrev_del (void *p) |
static htab_t | read_abbrev (DSO *dso, unsigned char *ptr) |
static char * | canonicalize_path (char *s, char *d) |
static int | has_prefix (const char *str, const char *prefix) |
static int | edit_dwarf2_line (DSO *dso, uint_32 off, char *comp_dir, int phase) |
static unsigned char * | edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase) |
static int | rel_cmp (const void *a, const void *b) |
static int | edit_dwarf2 (DSO *dso) |
static DSO * | fdopen_dso (int fd, const char *name) |
int | main (int argc, char *argv[]) |
Variables | |
char * | base_dir = NULL |
char * | dest_dir = NULL |
char * | list_file = NULL |
int | list_file_fd = -1 |
static uint_16(*) | do_read_16 (unsigned char *ptr) |
static uint_32(*) | do_read_32 (unsigned char *ptr) |
static void(*) | write_32 (unsigned char *ptr, GElf_Addr val) |
static int | ptr_size |
REL * | relptr |
REL * | relend |
int | reltype |
struct { | |
const char * name | |
unsigned char * data | |
Elf_Data * elf_data | |
size_t size | |
int sec | |
int relsec | |
} | debug_sections [] |
static struct poptOption | optionsTable [] |
#define _FILE_OFFSET_BITS 64 |
Definition at line 20 of file debugedit.c.
#define DEBUG_ABBREV 1 |
#define DEBUG_ARANGES 3 |
#define DEBUG_FRAME 8 |
#define DEBUG_INFO 0 |
#define DEBUG_LINE 2 |
Referenced by edit_dwarf2_line().
#define DEBUG_LOC 6 |
#define DEBUG_MACINFO 5 |
#define DEBUG_PUBNAMES 4 |
#define DEBUG_RANGES 9 |
#define DEBUG_STR 7 |
Referenced by edit_attributes(), and edit_dwarf2_line().
#define do_read_32_relocated | ( | ptr | ) |
Value:
({ \ uint_32 dret = do_read_32 (ptr); \ if (relptr) \ { \ while (relptr < relend && relptr->ptr < ptr) \ ++relptr; \ if (relptr < relend && relptr->ptr == ptr) \ { \ if (reltype == SHT_REL) \ dret += relptr->addend; \ else \ dret = relptr->addend; \ } \ } \ dret; \ })
Definition at line 153 of file debugedit.c.
Referenced by edit_attributes().
#define DW_TAG_partial_unit 0x3c |
#define IS_DIR_SEPARATOR | ( | c | ) | ((c)=='/') |
#define read_1 | ( | ptr | ) | *ptr++ |
Definition at line 136 of file debugedit.c.
#define read_16 | ( | ptr | ) |
Value:
({ \ uint_16 ret = do_read_16 (ptr); \ ptr += 2; \ ret; \ })
Definition at line 138 of file debugedit.c.
Referenced by edit_attributes(), and edit_dwarf2_line().
#define read_32 | ( | ptr | ) |
Value:
({ \ uint_32 ret = do_read_32 (ptr); \ ptr += 4; \ ret; \ })
Definition at line 144 of file debugedit.c.
Referenced by edit_attributes(), and edit_dwarf2_line().
#define read_32_relocated | ( | ptr | ) |
Value:
({ \ uint_32 ret = do_read_32_relocated (ptr); \ ptr += 4; \ ret; \ })
Definition at line 170 of file debugedit.c.
#define read_uleb128 | ( | ptr | ) |
Value:
({ \ unsigned int ret = 0; \ unsigned int c; \ int shift = 0; \ do \ { \ c = *ptr++; \ ret |= (c & 0x7f) << shift; \ shift += 7; \ } while (c & 0x80); \ \ if (shift >= 35) \ ret = UINT_MAX; \ ret; \ })
Definition at line 67 of file debugedit.c.
Referenced by edit_attributes(), edit_dwarf2_line(), and read_abbrev().
typedef unsigned short uint_16 |
Definition at line 49 of file debugedit.c.
typedef unsigned int uint_32 |
Definition at line 48 of file debugedit.c.
static void abbrev_del | ( | void * | p | ) | [static] |
static int abbrev_eq | ( | const void * | p, | |
const void * | q | |||
) | [static] |
Definition at line 254 of file debugedit.c.
References abbrev_tag::entry.
Referenced by read_abbrev().
static hashval_t abbrev_hash | ( | const void * | p | ) | [static] |
Definition at line 246 of file debugedit.c.
References abbrev_tag::entry.
Referenced by read_abbrev().
static uint_16 buf_read_ube16 | ( | unsigned char * | data | ) | [inline, static] |
Definition at line 96 of file debugedit.c.
static uint_32 buf_read_ube32 | ( | unsigned char * | data | ) | [inline, static] |
Definition at line 108 of file debugedit.c.
static uint_16 buf_read_ule16 | ( | unsigned char * | data | ) | [inline, static] |
Definition at line 90 of file debugedit.c.
static uint_32 buf_read_ule32 | ( | unsigned char * | data | ) | [inline, static] |
Definition at line 102 of file debugedit.c.
static char* canonicalize_path | ( | char * | s, | |
char * | d | |||
) | [static] |
Definition at line 346 of file debugedit.c.
References IS_DIR_SEPARATOR.
Referenced by edit_dwarf2_line().
static void dwarf2_write_be32 | ( | unsigned char * | p, | |
GElf_Addr | val | |||
) | [static] |
Definition at line 189 of file debugedit.c.
static void dwarf2_write_le32 | ( | unsigned char * | p, | |
GElf_Addr | val | |||
) | [static] |
Definition at line 177 of file debugedit.c.
static unsigned char* edit_attributes | ( | DSO * | dso, | |
unsigned char * | ptr, | |||
struct abbrev_tag * | t, | |||
int | phase | |||
) | [static] |
Definition at line 687 of file debugedit.c.
References abbrev_attr::attr, abbrev_tag::attr, base_dir, data, debug_sections, DEBUG_STR, dest_dir, do_read_32_relocated, DW_TAG_partial_unit, elf_data, DSO::filename, abbrev_attr::form, has_prefix(), name, abbrev_tag::nattr, ptr_size, read_16, read_32, read_uleb128, and abbrev_tag::tag.
static int edit_dwarf2 | ( | DSO * | dso | ) | [static] |
Definition at line 874 of file debugedit.c.
References data, debug_sections, DSO::ehdr, DSO::filename, name, ptr_size, DSO::scn, DSO::shdr, and strptr().
Referenced by main().
Definition at line 451 of file debugedit.c.
References alloca(), base_dir, canonicalize_path(), DEBUG_LINE, debug_sections, DEBUG_STR, dest_dir, elf_data, EXIT_FAILURE, file, DSO::filename, has_prefix(), list_file_fd, read_16, read_32, read_uleb128, and size.
static DSO* fdopen_dso | ( | int | fd, | |
const char * | name | |||
) | [static] |
Definition at line 1190 of file debugedit.c.
References DSO::ehdr, DSO::elf, DSO::filename, DSO::scn, and DSO::shdr.
Referenced by main().
static int has_prefix | ( | const char * | str, | |
const char * | prefix | |||
) | [static] |
Definition at line 435 of file debugedit.c.
Referenced by edit_attributes(), and edit_dwarf2_line().
int main | ( | int | argc, | |
char * | argv[] | |||
) |
Definition at line 1265 of file debugedit.c.
References base_dir, dest_dir, edit_dwarf2(), DSO::ehdr, errno, fdopen_dso(), file, list_file, list_file_fd, name, DSO::shdr, strerror, and strptr().
Definition at line 269 of file debugedit.c.
References abbrev_del(), abbrev_eq(), abbrev_hash(), abbrev_tag::attr, DSO::filename, htab_delete(), htab_find_slot(), htab_try_create(), INSERT, read_uleb128, and size.
static int rel_cmp | ( | const void * | a, | |
const void * | b | |||
) | [static] |
static const char* strptr | ( | DSO * | dso, | |
int | sec, | |||
off_t | offset | |||
) | [static] |
Definition at line 114 of file debugedit.c.
References data, and DSO::scn.
Referenced by edit_dwarf2(), and main().
char* base_dir = NULL |
Definition at line 43 of file debugedit.c.
Referenced by edit_attributes(), edit_dwarf2_line(), and main().
unsigned char* data |
Definition at line 202 of file debugedit.c.
Referenced by cacheContainsDirectory(), db3cdel(), db3cget(), db3cpget(), db3cput(), db_join(), db_put(), dbg_keyval(), dbiDel(), dbiFindByLabel(), dbiFindMatches(), dbiGet(), dbiPget(), dbiPut(), dbt2set(), edit_attributes(), edit_dwarf2(), ftpAbort(), ftpFileDone(), ftpReq(), hdr_subscript(), miFreeHeader(), open_dso(), rpmdbAdd(), rpmdbCountPackages(), rpmdbFindByFile(), rpmdbFindFpList(), rpmdbGrowIterator(), rpmdbInitIterator(), rpmdbNextIterator(), rpmdbRemove(), rpmfcELF(), rpmts_GetKeys(), set2dbt(), sql_bind_data(), sql_cdel(), sql_cget(), sql_cput(), strptr(), and unsatisfiedDepend().
struct { ... } debug_sections[] [static] |
Referenced by edit_attributes(), edit_dwarf2(), and edit_dwarf2_line().
char* dest_dir = NULL |
Definition at line 44 of file debugedit.c.
Referenced by edit_attributes(), edit_dwarf2_line(), and main().
uint_16(*) do_read_16(unsigned char *ptr) [static] |
Definition at line 83 of file debugedit.c.
uint_32(*) do_read_32(unsigned char *ptr) [static] |
Definition at line 84 of file debugedit.c.
Elf_Data* elf_data |
Definition at line 203 of file debugedit.c.
Referenced by edit_attributes(), and edit_dwarf2_line().
char* list_file = NULL |
int list_file_fd = -1 |
const char* name |
Definition at line 201 of file debugedit.c.
struct poptOption optionsTable[] [static] |
Initial value:
{ { "base-dir", 'b', POPT_ARG_STRING, &base_dir, 0, "base build directory of objects", NULL }, { "dest-dir", 'd', POPT_ARG_STRING, &dest_dir, 0, "directory to rewrite base-dir into", NULL }, { "list-file", 'l', POPT_ARG_STRING, &list_file, 0, "file where to put list of source and header file names", NULL }, POPT_AUTOHELP { NULL, 0, 0, NULL, 0, NULL, NULL } }
Definition at line 1178 of file debugedit.c.
int ptr_size [static] |
Definition at line 150 of file debugedit.c.
Definition at line 150 of file debugedit.c.
int relsec |
Definition at line 205 of file debugedit.c.
int reltype |
Definition at line 151 of file debugedit.c.
int sec |
Definition at line 205 of file debugedit.c.
size_t size |
Definition at line 204 of file debugedit.c.
Referenced by doReadRC(), DumpString(), edit_dwarf2_line(), find_empty_slot_for_expand(), htab_find_slot_with_hash(), htab_find_with_hash(), LoadCode(), LoadLines(), LoadString(), luaF_freeclosure(), luaZ_fill(), read_abbrev(), readIcon(), rpmalAdd(), rpmfiBuildFNames(), rpmioSlurp(), rpmVerifyFile(), setnodevector(), verifyHeader(), verifySizeSignature(), and xstrdup().
void(*) write_32(unsigned char *ptr, GElf_Addr val) [static] |
Definition at line 85 of file debugedit.c.