我一直在使用objdumpLinux ELF二进制文件中的汇编代码.
有时会通过存储在rodata(只读数据)部分中的跳转表进行间接跳转.
如何获取objdump或任何其他工具向我显示此数据部分的内容?
我可以执行程序并检查调试器中的相关地址,但我不想这样做,因为它必须以交互方式完成.
理想的答案将确定一个工具,不仅可以向我显示内容,还可以让我控制显示格式od.
来自wiki 可执行文件和可链接格式:
这些段包含运行时执行文件所必需的信息,而段包含用于链接和重定位的重要数据.整个文件中的任何字节最多只能由一个部分拥有,并且可能存在不属于任何部分的孤立字节.
但是段和段之间有什么区别?在可执行的ELF文件中,段是否包含一个或多个部分?
内核如何获得在linux下运行的可执行二进制文件?
这似乎是一个简单的问题,但任何人都可以帮助我深入挖掘?如何将文件加载到内存以及如何启动执行代码?
任何人都可以帮助我,一步一步地告诉我们发生了什么吗?
我有一个正在建设的图书馆.当我运行以下任何一个时,我的所有对象都会连续编译和链接:
ar rcs lib/libryftts.a $^
gcc -shared $^ -o lib/libryftts.so
在我的Makefile中.我也能够成功安装它们/usr/local/lib
当我用nm测试文件时,所有的功能都在那里.我的问题是,当我跑步gcc testing/test.c -lryftts -o test && file ./test或gcc testing/test.c lib/libryftts.a -o test && file ./test
它说:
test: ELF 64-bit LSB shared object而不是test: ELF 64-bit LSB executable像我期望的那样.我究竟做错了什么?
我有一个独立的 Linux 独立 x86_64 hello world 工作岗位:
电源
.text
.global _start
_start:
asm_main_after_prologue:
/* Write */
mov $1, %rax /* syscall number */
mov $1, %rdi /* stdout */
lea msg(%rip), %rsi /* buffer */
mov $len, %rdx /* len */
syscall
/* Exit */
mov $60, %rax /* syscall number */
mov $0, %rdi /* exit status */
syscall
msg:
.ascii "hello\n"
len = . - msg
Run Code Online (Sandbox Code Playgroud)
我可以组装和运行:
as -o main.o main.S
ld -o main.out main.o
./main.out
Run Code Online (Sandbox Code Playgroud)
由于RIP …