Embedded linux 无法访问由objcopy创建的文件中的大小变量

Embedded linux 无法访问由objcopy创建的文件中的大小变量,embedded-linux,Embedded Linux,我试图使用objcopy将xml文件转换为对象文件,然后链接到RHEL5上的另一个共享库中并由其使用。我使用以下命令转换文件: objcopy--输入格式二进制--输出目标i386 pc linux gnu--二进制体系结构i386 baselines.xml baselines.0 创建对象文件,并使用readelf获得以下内容: 符号表“.symtab”包含5个条目: Num:值大小类型绑定到Ndx名称 0:00000000 0不键入本地默认值 1:00000000节本地默认值1 2:000

我试图使用objcopy将xml文件转换为对象文件,然后链接到RHEL5上的另一个共享库中并由其使用。我使用以下命令转换文件:

objcopy--输入格式二进制--输出目标i386 pc linux gnu--二进制体系结构i386 baselines.xml baselines.0

创建对象文件,并使用readelf获得以下内容:

符号表“.symtab”包含5个条目: Num:值大小类型绑定到Ndx名称 0:00000000 0不键入本地默认值 1:00000000节本地默认值1 2:00000000 NOTYPE全局默认值1\u二进制\u基线\u xml\u sta 3:0000132b 0 NOTYPE全局默认值1 \u二进制\u基线\u xml\u结束 4:0000132b 0 NOTYPE全局默认ABS二进制基线xml大小

看起来尺寸在里面。我转储了该文件,并验证了xml在偏移量34处嵌入为ascii(由.data值指定),并且它是正确的。数据大小为0x132b字节,由变量指定

然后在代码中,我声明了几个变量:

extern "C"
{
    extern char _binary_baselines_xml_start;
    extern char _binary_baselines_xml_size;
}
static const char* xml_start = &_binary_baselines_xml_start;
const uint32_t xml_size = reinterpret_cast<uint32_t>(&_binary_baselines_xml_size);
extern“C”
{
外部字符(二进制)基线(xml)开始;;
外部字符(二进制)基线(xml)大小;;
}
静态常量char*xml\u start=&u二进制\u基线\u xml\u start;
const uint32_t xml_size=重新解释强制转换(&_binary_baselines_xml_size);
当我进入这个步骤时,xml指针是正确的,我可以在调试器中看到xml文本。但是,大小符号将值显示为0x132b(这是我想要的),但它也表示“地址0x132b超出范围”。当我使用变量时,它是一个非常大的错误随机数。我尝试了各种其他语法来声明外部变量,例如char*、char[]、int、int*,等等。结果总是一样的。价值在那里,但我似乎无法实现

另一个有趣的地方是,这段代码在windows机器上运行良好,外部变量上没有加下划线,但其他所有变量都一样


我在网上似乎找不到太多关于以这种方式使用objcopy的信息,因此非常感谢您的帮助。

我不确定您的实际问题是什么。*_尺寸符号是表示尺寸的绝对符号。您不应该能够实际引用该位置(除非是偶然),它只是一种将整数值潜入链接器而不实际定义数据变量的方法。你所做的在你如何使用它方面是正确的

考虑这一点的最佳方法是使用以下代码:

char* psize = reinterpret_cast<char*>(0x1234); int size = reinterpret_cast<int>(psize); char*psize=重新解释(0x1234); int size=重新解释施法(心灵术);
唯一的区别是链接器通过符号为您填充0x1234值。

我需要大小,因为二进制xml数据不是以null结尾的,我想将其复制到可以使用的缓冲区。该符号不可访问,因此在运行时未填充该符号。我让它在一个简单的测试程序中工作,其中有一个.so定义并返回数据,还有一个main使用.so获取数据。但是,main.cpp必须包含带有extern声明的.so cpp文件,或者将extern放入.so头中并创建引用该变量的函数。