标签: elf

如何找到共享库的符号的绝对地址?

我想写一个小函数的跟踪器.我用ptrace.

当我看到CALL指令时,我想显示相当于地址调用的函数名称.

我的跟踪器使用带有绝对地址的符号(符号在主二进制文件中定义).但我不知道如何在虚拟内存中获取共享库函数的绝对地址.例如,检测对libc函数的调用.

我注意到共享库中函数的地址是相对于文件的.

以下等式是否良好?

Absolute address of symbol = address of the shared library in virtual memory +
                             relative address of the symbol.
Run Code Online (Sandbox Code Playgroud)

如何从共享库中获取符号的绝对地址?

c symbols shared-libraries elf

5
推荐指数
1
解决办法
1957
查看次数

当我想要一个共享库时,GCC输出一个可执行的ELF文件

我正在尝试使用i686-elf交叉编译器在Cygwin中构建一个共享库.代码很简单:

int add(int a, int b) {
    return a + b;
}

void _init() {
    add(3, 4);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令进行编译:

i686-elf-gcc -fPIC -shared -nostdlib core.c -o libcore.so
Run Code Online (Sandbox Code Playgroud)

这应该是一个共享对象,对吧?但GCC会输出一个警告_start,指出无法找到符号,这是可执行文件的入口点,而不是共享对象.此外,readelf说如下:

$ readelf -a libcore.so
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  ...
  Type:                              EXEC (Executable file)
  ...
Run Code Online (Sandbox Code Playgroud)

这里出了什么问题?

c gcc shared-libraries elf cross-compiling

5
推荐指数
1
解决办法
1278
查看次数

如何从C中检查目标文件是否为COFF或ELF格式?

我希望能够从我的C代码中检查目标文件的格式,以便我可以根据它是COFF还是ELF格式使用不同的函数来读取文件.

这是可能的,如果是的话,我该怎么做?

这在Linux顺便说一下,如果这有任何区别.

c linux coff elf

5
推荐指数
3
解决办法
7279
查看次数

ELF程序标题段大小和偏移量

我正在尝试理解ELF格式,现在有些事情我没有得到关于程序头中定义的段.我有这个小代码,我用g ++(Linux上的x86_x64)转换为ELF文件:

#include <stdlib.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    if (argc == 1)
    {
        cout << "Hello world!" << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

随着g++ -c -m64 -D ACIS64 main.cpp -o main.og++ -s -O1 -o Main main.o.现在,使用readelf我得到这个段列表:

Program Headers:
Type           Offset             VirtAddr           PhysAddr
               FileSiz            MemSiz             Flags      Align
PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
               0x00000000000001f8 0x00000000000001f8 R E        8
INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
               0x000000000000001c 0x000000000000001c R          1
[Requesting program …
Run Code Online (Sandbox Code Playgroud)

size header elf offset segment

5
推荐指数
1
解决办法
9963
查看次数

CMake:将ELF嵌入可执行文件

我有一个项目需要访问嵌入到可执行文件中特殊部分的ELF文件。

我以前是手工制作Makefile的,只是有一个shell脚本,在其中使用objcopy将要嵌入的目标复制到.o文件中,然后在可执行文件中链接到该文件。

# Create a new section and copy the binary there ($1=input $2=output name)
objcopy --input-target binary --output-target elf64-x86-64 \
        --binary-architecture i386 $1 $2.o
Run Code Online (Sandbox Code Playgroud)

现在,我想摆脱自定义的Makefile,并使用CMake生成它们。但是,我看不到链接到此类文件的简便方法。我可以创建和添加此文件,但不能对其进行链接:

# Invoke script to package module as a library
add_custom_command(OUTPUT ${PACKAGED_FILE}
  COMMAND ./package.sh ${MODULE_FILE} ${PACKAGED_FILE}
  WORKING_DIRECTORY ${MODULE_DIR}
  DEPENDS ${MODULE_FILE}
  COMMENT packaging file into ELF object
  VERBATIM
)

add_custom_target(${PACKAGED_NAME} ALL DEPENDS ${PACKAGED_FILE})
Run Code Online (Sandbox Code Playgroud)

我试图用添加它:

target_link_libraries(binary ${PROJECT_BINARY_DIR}/${PACKAGED_FILE})
Run Code Online (Sandbox Code Playgroud)

但是,此操作失败,因为该文件尚不存在。会的,但是CMake不知道。将目标名称添加为链接库也无济于事,因为找不到它。将其添加为还依赖项也无济于事。有谁知道如何做到这一点?

c c++ makefile cmake elf

5
推荐指数
1
解决办法
2744
查看次数

编辑ELF二进制调用指令

我正在玩操纵二进制的调用函数.我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void myfunc2(char *str2, char *str1);

    enter code here

void myfunc(char *str2, char *str1)
{
    memcpy(str2 + strlen(str2), str1, strlen(str1));
}

int main(int argc, char **argv)
{
    char str1[4] = "tim";
    char str2[10] = "hello ";

    myfunc((char *)&str2, (char *)&str1);

    printf("%s\n", str2);

        myfunc2((char *)&str2, (char *)&str1);

    printf("%s\n", str2);

    return 0;
}

void myfunc2(char *str2, char *str1)
{
    memcpy(str2, str1, strlen(str1));
}
Run Code Online (Sandbox Code Playgroud)

我编译了二进制文件并使用readelf或objdump我可以看到我的两个函数驻留在:

46:0000000000 40072c 52 FUNC GLOBAL DEFAULT 13 myfunc2**

54:0000000000 40064d 77 FUNC …

c assembly reverse-engineering elf

5
推荐指数
1
解决办法
1054
查看次数

ELF中SHT_NULL节的用途是什么?

  1. SHT_NULL节的目的是什么ELF
  2. 它是由OS还是加载器引用的?
  3. 这部分的大小是多少?
  4. 它和NULL指针有关系吗?
  5. 另外,为什么本节在节段映射中没有条目?

根据ELF规范:

SHT_NULL:此值将节标题标记为无效;它没有关联的部分。节标题的其他成员具有未定义的值。

elf

5
推荐指数
2
解决办法
1525
查看次数

比较可执行文件或目标文件

我有两个文件应该从相同的源版本生成。其中一个文件被剥离。是否可以比较文件的原始可执行部分以确定它们是否相同?还可以在目标文件上(尤其是在.ko linux内核模块上)完成吗?

最好的祝福

linux compare strip elf

5
推荐指数
2
解决办法
8248
查看次数

ARM上TLS的代码序列

ELF处理线程局部存储文件给出了各种模型装配顺序(本地的exec /初始EXEC /一般动态)的各种架构.但不是ARM - 我能在哪里看到ARM的代码序列吗?我正在编写一个编译器,并希望生成能够与平台链接器(程序和动态)一起正常运行的代码.

为清楚起见,我们假设一个ARMv7 CPU和一个非常新的内核和glibc(比如说3.13+/2.19+),但是如果这很容易解释,我也会对旧的hw/sw需要改变什么感兴趣.

linux arm elf abi thread-local-storage

5
推荐指数
1
解决办法
1850
查看次数

从头开始编写ELF64时出现Exec错误

我试图通过从头开始编写一个elf可执行文件来了解elf标准.使用以下代码,Elf32没有造成太大问题:

BITS 32

            org     0x08048000

ehdr:                                                 ; Elf32_Ehdr
            db      0x7F, "ELF", 1, 1, 1, 2         ;   e_ident
    times 8 db      0
            dw      2                               ;   e_type
            dw      3                               ;   e_machine
            dd      1                               ;   e_version
            dd      _start                          ;   e_entry
            dd      phdr - $$                       ;   e_phoff
            dd      0                               ;   e_shoff
            dd      0                               ;   e_flags
            dw      ehdrsize                        ;   e_ehsize
            dw      phdrsize                        ;   e_phentsize
            dw      1                               ;   e_phnum
            dw      0                               ;   e_shentsize
            dw      0                               ;   e_shnum
            dw      0                               ;   e_shstrndx

ehdrsize      equ     $ - ehdr …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 elf

5
推荐指数
1
解决办法
146
查看次数