使用内联汇编嵌入资源

时间:2014-08-08 10:49:57

标签: gcc global-variables inline-assembly

我试图一起使用这个技巧将资源嵌入到可执行文件中:

#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:

有没有办法使用不干扰调试的内联汇编添加全局符号?是否在函数体外部未定义?

1 个答案:

答案 0 :(得分:2)

您需要在内联asm结尾处将该部分恢复回.text。您可以使用.pushsection.popsection todo。