gpt4 book ai didi

c - 为什么链接的二进制文件的 _size 符号不能正常工作?

转载 作者:太空宇宙 更新时间:2023-11-04 02:23:14 25 4
gpt4 key购买 nike

我使用“ld -r -b binary -o binary.o foo.jpeg”在我的程序中嵌入资源。效果棒极了。我只是想知道为什么 int _binary_size 符号永远不会正确读取负数或太大的数字,但在程序运行之间保持不变。我总是必须执行 _binary_end - _binary_start,它可以完美地工作。似乎它对任何人都不起作用... like here ....这是为什么?

没有理由不使用 end-start,因为它取代了大小符号,但它仍然让我感到好奇。

编辑:代码示例。

extern const unsigned char _binary_scna4_jpg_start;
extern const unsigned char _binary_scna4_jpg_end;
extern const int _binary_scna4_jpg_size;

int size = &_binary_scna4_jpg_end - &_binary_scna4_jpg_start;
printf("Size is %d vs %d \n", size, _binary_scna4_jpg_size);

这打印:

Size is 1192071 vs -385906356 

第一个数字是二进制文件的正确大小,我的所有图像都可以完美读取。

良好测量的 nm 输出:

0000000000123087 D _binary_scna4_jpg_end
0000000000123087 A _binary_scna4_jpg_size
0000000000000000 D _binary_scna4_jpg_start

最佳答案

问题的出现是因为Position-Independent Executables (馅饼)。早期的可执行文件被加载到相同的内存地址(在编译/链接时确定),这导致可能的攻击,因为攻击者知道程序的特定部分在哪个地址。因此Address Space Layout Randomization已实现。这有一个副作用,即大小符号被定义为绝对地址(_binary_scna4_jpg_size 不是整数值,它是一个“指针”,就像 _start 和 _end)也得到加载时重新定位。

如果您使用选项 -no-pie 编译您的代码,您可以禁用位置独立并且 _binary_scna4_jpg_size 将输出正确的值,因为它不会被重新定位。由于 PIE 现在默认打开,指针的值基本上是垃圾。如果您知道重定位内存的开头,也可以使用它,但由于您已经有了 _binary_scna4_jpg_start_binary_scna4_jpg_end,所以使用它们是一样的。

关于c - 为什么链接的二进制文件的 _size 符号不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54844677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com