我试图一起使用这个技巧将资源嵌入到可执行文件中:
#define INCLUDE_BINARY(identifier,filename) \
asm("\t.data\n" \
"\t.local " #identifier "_begin\n" \
"\t.type " #identifier "_begin, @object\n" \
"\t.align 16\n" \
#identifier "_begin:\n" \
"\t.incbin \"" filename "\"\n\n" \
\
"\t.local " #identifier "_end\n" \
"\t.type " #identifier "_end, @object\n" \
"\t.align 1\n" \
#identifier "_end:\n" \
"\t.byte 0\n"); \
\
extern uint8_t identifier##_begin[];\
extern const uint8_t identifier##_end[]
那样
#include <herbs/include_binary/include_binary.h>
#include <herbs/main/main.h>
#include <cstdio>
INCLUDE_BINARY(source,__FILE__);
int MAIN(int argc,charsys_t* argv[])
{
const uint8_t* begin=source_begin;
while(begin!=source_end)
{
putchar(*begin);
++begin;
}
return 0;
}
将自行打印。它工作正常,直到我启用调试符号生成。然后我得到错误:
/tmp/ccCfX7kc.s:103: Error: can't resolve `.data' {.data section} - `.Ltext0' {.text section}
我猜失败的原因是-g
在文件开头添加了东西:
.text
.Ltext0:
有没有办法使用不干扰调试的内联汇编添加全局符号?是否在函数体外部未定义?
答案 0 :(得分:2)
您需要在内联asm结尾处将该部分恢复回.text
。您可以使用.pushsection
和.popsection
todo。