通过objcopy将2进制文件作为.o中的一个段
通过objcopy将2进制文件作为.o中的一个段(.data)
然后静态链接到执行文件,可以在文件中操作2进制文件的内容(文本,图片等)
objcopy
-I
–input-target输入文件的格式 -O
–output-target创造输出文件的格式 -B
–binary-architecture设置输出的系统架构
例如:将文本文件(这里直接拿.c代码 ascii text)生成为data.o(目标文件)的一个段
在这之前要知道自己机器的架构,应该都是x64-linux
objcopy -I binary -O elf64-x86-64 -B i386:x86-64 test.c data.o
- 查看data.o所有的section
readelf -S data.o
- 查看data.o的data段(section)
readelf -x .data data.o
可以看到成功将2进制文本生成为.o文件的一个section(段),而且是.data段
3. 如何在代码中使用这段内存?
使用生成.o文件时生成的符号,在符号表中查看
readelf -s data.o
测试代码:
1 |
|
makefile:
1 |
|
make后运行,结果输出了.data段的大小,和size data.o
的结果对比一下发现二进制数据大小是正确的
_binary_object_start符号是什么数据类型?
这里原以为是指针,找了找发现不是,是数据而不是地址,因为生成前是字符,所以这里用char
声明这个符号,(其实无所谓,int也行,在输出时取地址后还是被转为char*)
_binary_object_end 同上
_binary_object_size
用gdb发现其值是0,地址也不在_start
和_end
范围内
[1]:<<编译链接装载>>
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!