在C中导入二进制blob并使用其大小变量(符号)将导致内存错误

eaf3rand  于 2023-02-21  发布在  其他
关注(0)|答案(1)|浏览(111)
    • 免责声明**:我没有适当的开发人员/程序员教育,这可能会在这里有所帮助。我所知道的是从不同的来源收集,并放在一起,在显示的形式。

我通过在代码中引用运行ld -b binary得到的符号,将一段shell代码(或任何二进制代码)导入到C程序中,其思想来自embedding-binary-blobs-using-gcc-mingw/embedding-resources-in-executable-using-gcc
代码如下所示:

extern unsigned int _binary_file_size; //Declaring the external symbol
extern char _binary_file_start[]; //Declaring the external symbols

memcpy(exec, _binary_file_start, _binary_file_size)

问题是程序不工作,调试器显示它试图在"size"的内存位置加载内存地址。
RAX to load the address of where the size is and then get the data at that memory locations ([0x82]) which is actually the size and not a memory address
The content of the memory where the size is
因为我找不到关于这些符号的文档,只有引用,所以我盲目地做了一些实验,尝试将变量的类型设置为指针,并在调用时取消引用。因为我对指针,双指针,取消引用和内存寻址没有100%的把握,所以我只是做了一些经验性的修改来查看输出。
有时候我想从C而不是调试器中查看变量内存,令我惊讶的是,&_binary_file_size返回了0x80(数据的大小)。现在我已经将代码更改为使用&_binary_file_size,它工作正常(但在编译时有一些类型警告)。
问题是:* * 使用 _binary_file_size * 符号的正确方法是什么?*
有两种解决方法:使用变量的地址(&)或通过从_end变量中减去_start来计算大小。
似乎在SO的一个线程中,我用它来激发别人对这个变量的看法。

zujrkrfu

zujrkrfu1#

这是一个奇怪的现象,但是_binary_file_size是一个符号,而不是变量。要使用它,你需要在它的地址上获得值,然后将它转换为(size_t) &_binary_file_size。我想它也可以像你一样在没有显式转换的情况下工作,但是它确实使发生的事情变得更清楚。
_binary_file_start_binary_file_end也是符号地址,不用说,这两个地址之间的差等于数据的长度。
这两种方法都不是变通方法。它们都是获得大小的有效方法。

相关问题