Embedding resources in executable using GCC

前端 未结 4 1704
小鲜肉
小鲜肉 2020-11-22 16:21

I\'m looking for a way to easily embed any external binary data in a C/C++ application compiled by GCC.

A good example of what I\'d like to do is handling shader cod

4条回答
  •  孤城傲影
    2020-11-22 17:07

    There are a couple possibilities:

    • use ld's capability to turn any file into an object (Embedding binary blobs using gcc mingw):

      ld -r -b binary -o binary.o foo.bar  # then link in binary.o
      
    • use a bin2c/bin2h utility to turn any file into an array of bytes (Embed image in code, without using resource section or external images)


    Update: Here's a more complete example of how to use data bound into the executable using ld -r -b binary:

    #include 
    
    // a file named foo.bar with some example text is 'imported' into 
    // an object file using the following command:
    //
    //      ld -r -b binary -o foo.bar.o foo.bar
    //
    // That creates an bject file named "foo.bar.o" with the following 
    // symbols:
    //
    //      _binary_foo_bar_start
    //      _binary_foo_bar_end
    //      _binary_foo_bar_size
    //
    // Note that the symbols are addresses (so for example, to get the 
    // size value, you have to get the address of the _binary_foo_bar_size
    // symbol).
    //
    // In my example, foo.bar is a simple text file, and this program will
    // dump the contents of that file which has been linked in by specifying
    // foo.bar.o as an object file input to the linker when the progrma is built
    
    extern char _binary_foo_bar_start[];
    extern char _binary_foo_bar_end[];
    
    int main(void)
    {
        printf( "address of start: %p\n", &_binary_foo_bar_start);
        printf( "address of end: %p\n", &_binary_foo_bar_end);
    
        for (char* p = _binary_foo_bar_start; p != _binary_foo_bar_end; ++p) {
            putchar( *p);
        }
    
        return 0;
    }
    

    Update 2 - Getting the resource size: I could not read the _binary_foo_bar_size correctly. At runtime, gdb shows me the right size of the text resource by using display (unsigned int)&_binary_foo_bar_size. But assigning this to a variable gave always a wrong value. I could solve this issue the following way:

    unsigned int iSize =  (unsigned int)(&_binary_foo_bar_end - &_binary_foo_bar_start)
    

    It is a workaround, but it works good and is not too ugly.

提交回复
热议问题