gpt4 book ai didi

c++ - 数据文件的 ld 使数据大小成为 *ABS* 而不是整数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:25 24 4
gpt4 key购买 nike

我有一个 C++ 程序,它包含对一个空 xlsx 文件的外部依赖。为了消除这种依赖性,我将这个文件转换为二进制对象,以便直接链接它,使用:

ld -r -b binary -o template.o template.xlsx

其次是

objcopy --rename-section .data=.rodata,alloc,load,readonly,data,contents template.o template.o

使用 objdump,我可以看到声明了三个变量:

$ objdump -x template.o

template.o: file format elf64-x86-64
template.o
architecture: i386:x86-64, flags 0x00000010:
HAS_SYMS
start address 0x0000000000000000

Sections:
Idx Name Size VMA LMA File off Algn
0 .rodata 00000fd1 0000000000000000 0000000000000000 00000040 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
SYMBOL TABLE:
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000fd1 g *ABS* 0000000000000000 _binary_template_xlsx_size
0000000000000000 g .rodata 0000000000000000 _binary_template_xlsx_start
0000000000000fd1 g .rodata 0000000000000000 _binary_template_xlsx_end

然后我将这些数据告诉我的程序:

template.h:
#ifndef TEMPLATE_H
#define TEMPLATE_H

#include <cstddef>
extern "C" {
extern const char _binary_template_xlsx_start[];
extern const char _binary_template_xlsx_end[];
extern const int _binary_template_xlsx_size;
}
#endif

这编译和链接很好,(虽然我在用 cmake 自动化它时遇到了一些麻烦,请参见这里:compile and add object file from binary with cmake)

但是,当我在代码中使用 _binary_template_xlsx_size 时,它​​被解释为指向不存在的地址的指针。因此,为了获得数据的大小,我必须传递 (int)&_binary_template_xlsx_size(或 (int)(_binary_template_xlsx_end - _binary_template_xlsx_start))

一些研究告诉我,上面 objdump 中的 *ABS* 表示“绝对值”,但我不明白为什么。如何让我的 C++(或 C)程序将变量视为 int 而不是指针?

最佳答案

*ABS* 符号是一个绝对地址;它通常是通过将 --defsym foo=0x1234 传递给 ld 创建的。

--defsym symbol=expression

Create a global symbol in the output file, containing the absolute address given by expression. [...]

因为绝对符号是常量,所以不可能将它作为变量链接到 C 源文件中;所有 C 对象变量都有地址,但常量没有。

为确保您不会意外取消引用地址(即读取变量),最好将其定义为 const char [],就像您对其他符号所做的那样:

  extern const char _binary_template_xlsx_size[];

如果您想确保将其用作int,您可以使用宏:

  extern const char _abs_binary_template_xlsx_size[] asm("_binary_template_xlsx_size");
#define _binary_template_xlsx_size ((int) (intptr_t) _abs_binary_template_xlsx_size)

关于c++ - 数据文件的 ld 使数据大小成为 *ABS* 而不是整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814872/

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