如何使用incbin指令编译时包含二进制文件的最后指定字节?
用GNU汇编器
incbin直接读取大文件末尾指定字节 针对TB级大文件,无需生成中间文件的解决方案:利用汇编预处理器结合shell命令获取文件大小,计算出从文件开头到目标区域的偏移,再传递给incbin指令。
核心思路
GNU汇编器(as)的.incbin指令语法为:
.incbin "filename"[, skip[, count]]
其中skip是从文件开头算起的字节偏移,count是要读取的字节数。要读取文件最后N字节,只需计算skip = 文件总大小 - N,再将该值传入.incbin即可。
具体实现
- 编写汇编文件(例如
last_bytes.S):
// 配置参数:目标文件路径和要提取的字节数 #define TARGET_FILE "huge_file.bin" #define BYTES_TO_EXTRACT 16 // 通过shell的stat命令获取文件总大小(类Unix环境适用) #define FILE_TOTAL_SIZE $(stat -c %s TARGET_FILE) .section .rodata file_last_part: // 计算起始偏移:总大小 - 要提取的字节数 .incbin TARGET_FILE, FILE_TOTAL_SIZE - BYTES_TO_EXTRACT, BYTES_TO_EXTRACT
- 编译汇编文件:
使用GCC调用C预处理器处理汇编文件,再汇编生成目标文件:
gcc -c -x assembler-with-cpp last_bytes.S -o last_bytes.o
或者手动用预处理器+汇编器:
cpp last_bytes.S | as -o last_bytes.o
为什么适合TB级文件
stat命令仅读取文件元数据,无需扫描整个文件,耗时可忽略.incbin会通过文件系统的seek操作直接跳到目标偏移位置,仅读取指定字节,不会加载整个TB级文件到内存或磁盘
内容的提问来源于stack exchange,提问作者Cukiernik
相关产品推荐
相关产品推荐

