我已将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然后取其地址似乎是错误的。
是否有更多"更多"这样做的正确方法,我不知道?
答案 0 :(得分:3)
这是正确的方法 - 目标文件并没有真正将符号区分为“地址”而非“值”。实际上,对于链接器,_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
作为对象的大小。