【问题标题】:C How to translate st_value of entry into value?C如何将条目的st_value转换为值?
【发布时间】:2021-09-05 10:49:48
【问题描述】:

当我在 可执行文件 Elf 文件上使用 -s 标志调用 readelf 时,我得到:

Num:    Value          Size Type    Bind   Vis      Ndx Name
43: 00000000004004e7    30 FUNC    GLOBAL DEFAULT   13  find_me_func

但是当我读取索引 43 处的符号表条目时,我有:

st_name: 259
st_info: 18 '\022'
st_other: 0 '\0000'
st_shndx: 13
st_value: 4195559
st_size: 30

我的问题是如何使用我必须获得的信息:00000000004004e7? 我认为它与st_value


注意:也许这些宏可以提供帮助?

/*
 * Dynamic structure.  The ".dynamic" section contains an array of them.
 */
typedef struct {
    Elf64_Sxword d_tag;        /* Entry type. */
    union {
        Elf64_Xword d_val;    /* Integer value. */
        Elf64_Addr d_ptr;    /* Address value. */
    } d_un;
} Elf64_Dyn;

/*
 * Relocation entries.
 */

/* Relocations that don't need an addend field. */
typedef struct {
    Elf64_Addr r_offset;    /* Location to be relocated. */
    Elf64_Xword r_info;        /* Relocation type and symbol index. */
} Elf64_Rel;

/* Relocations that need an addend field. */
typedef struct {
    Elf64_Addr r_offset;    /* Location to be relocated. */
    Elf64_Xword r_info;        /* Relocation type and symbol index. */
    Elf64_Sxword r_addend;    /* Addend. */
} Elf64_Rela;

/* Macros for accessing the fields of r_info. */
#define    ELF64_R_SYM(info)    ((info) >> 32)
#define    ELF64_R_TYPE(info)    ((info) & 0xffffffffL)

/* Macro for constructing r_info from field values. */
#define    ELF64_R_INFO(sym, type)    (((sym) << 32) + ((type) & 0xffffffffL))

#define    ELF64_R_TYPE_DATA(info)    (((Elf64_Xword)(info)<<32)>>40)
#define    ELF64_R_TYPE_ID(info)    (((Elf64_Xword)(info)<<56)>>56)
#define    ELF64_R_TYPE_INFO(data, type)    \
                (((Elf64_Xword)(data)<<8)+(Elf64_Xword)(type))

【问题讨论】:

  • 我知道其他是保留的,我知道什么是名称和信息字段,所以我相信这些不会有帮助

标签: c memory elf symbol-table readelf


【解决方案1】:

00000000004004e74195559 的十六进制表示,即您的st_value

您可以使用%xprintf() 来打印十六进制值。添加%016x等数字以指定位数。

#include <stdio.h>

int main(void) {
    int st_value = 4195559;
    printf("%016x\n", st_value);
    return 0;
}

或者如果你想要 64 位值:

#include <stdio.h>
#include <inttypes.h>

int main(void) {
    uint64_t st_value = UINT64_C(4195559);
    printf("%016" PRIx64 "\n", st_value);
    return 0;
}

【讨论】:

  • 那为什么它没有在我的代码中保存为十六进制:fread(&amp;sym_table[i], sizeof(sym_table[0]), 1, file);
  • 我也有:Elf64_Addr st_value;
  • 因为您将数字加载为二进制而不是将其转换为十六进制?
  • 那为什么我得到 first_inst_data=-1? unsigned long func_start_addr = st_value; long first_inst_data = ptrace(PTRACE_PEEKTEXT, child_pid, (void *) func_start_addr, NULL);
  • 这段代码正在被调试的子进程中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2011-03-04
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多