【问题标题】:How can I reference an absolute symbol in an object file?如何在目标文件中引用绝对符号?
【发布时间】:2014-08-11 14:12:21
【问题描述】:

我已将 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 然后获取其地址似乎是错误的。

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

【问题讨论】:

    标签: c++ c linker


    【解决方案1】:

    这是正确的做法——目标文件并没有真正区分符号是“地址”还是“值”。实际上,对于链接器来说,_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作为对象的大小了。

    【讨论】:

    • 不是最漂亮的解决方案,但我想这就是它必须的方式!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2023-03-26
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多