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

时间:2014-08-11 14:12:22

标签: c++ c linker

我已将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 个答案:

答案 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作为对象的大小。

相关问题