如何在目标文件中引用绝对符号?

3

我已经将一个jpg文件编译成了一个目标文件,并尝试在我的程序中引用它。符号表如下:

user@host:~$ nm binary_artifacts.o 
000000000000ade3 D _binary_obj_jpg_end
000000000000ad00 A _binary_obj_jpg_size
00000000000000e3 D _binary_obj_jpg_start
user@host:~$

对于 _binary_obj_jpg_start 和 _binary_obj_jpg_end 符号,使用 char* 访问它们非常简单。然而,_binary_obj_jpg_size 符号让我有些困扰。

我尝试将其声明为:

extern const unsigned int const _binary_obj_jpg_size;

但是当我直接使用该符号时,程序出现了段错误。当我在程序中使用以下代码时,我可以正确获取大小:
extern const unsigned int const _binary_obj_jpg_size;
printf("Size: %d\n", (int)&_binary_obj_jpg_size); 

但是将其声明为int,然后取其地址似乎是错误的。

是否有我不知道的“更正确”的方法?

1个回答

4
这是正确的操作方式——对象文件实际上并不将符号区分为“地址”还是“值”。事实上,对于链接器来说,_binary_obj_jpg_size看起来只是一个位于地址0xad00处的变量,这导致了段错误。这就是为什么您需要使用它的地址。
另一种思考方式是,_binary_obj_jpg_size实际上是指针差(名义上的ptrdiff_t),转换成指针是有效的,但使用该指针的行为未定义。然而,将其强制转换回整数却是有效的。
为避免“错误”,您可以在宏中伪装它:
extern const void *_binary_obj_jpg_size; // note that the type doesn't really matter - only the address does
#define BINARY_OBJ_JPG_SIZE ((size_t)(uintptr_t)&_binary_obj_jpg_size)

然后,您可以自然地使用BINARY_OBJ_JPG_SIZE作为对象的大小。


不是最美观的解决方案,但我想那就是必须的方式! - samoz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接