gpt4 book ai didi

C/symbol 中的 const 数组在使用 nm 编译的 *.o 文件中不可见

转载 作者:太空狗 更新时间:2023-10-29 15:32:55 26 4
gpt4 key购买 nike

我正在为一个嵌入式 power-pc 平台编程(使用 wind-river diab 编译器,如果这很重要)并且想将我的代码与预编译的目标文件 *.o 链接(为同一平台编译,类(class))。其中一个目标文件需要一个外部符号,我必须自己定义它并链接到那个 *.o 文件——否则链接器会提示:

Undefined symbol 'mySymbolName' in file 'precompiled.o'

然而,即使我编译一个带有缺失符号的源文件(与预编译 o.* 文件期望的签名相同:'unsigned char const [16]')并将其链接到 precompiled.o,链接器仍然会提示.我的文件.c:

unsigned char const mySymbolName[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

我用命令编译代码:

bin/dplus -g -Xdebug-dwarf3 -W:c++:.c -Xc++-abr -Xmake-dependency=0xd -Xsmall-data=0 -Xsmall-const=0 -Xlint=0x40 -O -tPPC5554FF:cross -I{some include pathes...}   -DTOOL_FAMILY=diab -DTOOL=diab -DPowerPC -DPPC5500  -o "myObjectFile.o" -c "myCFile.c"

编译器警告我,mySymbolName 已声明但从未使用过(当然它不是 - 它是从另一个目标文件引用的 - 所以我认为警告很好)。使用命令链接:

bin/dld   -tPPC5554FF:cross file.dld -o "output.elf"  myObjectFile.o precompiled.o

失败并出现错误:

Undefined symbol 'mySymbolName' in file 'precompiled.o'

使用 nm(当然是针对特定的目标平台)我发现,我的符号在我编译的目标文件中不可见:nm 只是不显示任何内容。但是,我找到了一种以 nm 显示我的符号的方法。如果我在我的 c 文件中删除 'const' 说明符,则:

unsigned char mySymbolName[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

nm 正确显示 mySymbolName。

所以我的问题是:这怎么可能?这是预期的行为 - 或者它在不同平台上的行为是否不同?是否允许优化 ANSI-C 编译器以在编译时删除未引用的常量变量?

最佳答案

您的 Diab 编译器调用似乎在强制进行 C++ 编译,C++ 中 const 的语义在很多方面与 C 中的不同。

在 C++ 中,文件范围内的 const 具有隐式静态(或内部)链接,因此不会放置在目标文件的符号表中。这与 C 的行为不同,因此如果您使用 C 编译,它会产生您预期的结果。

添加显式 extern 声明(或使用 C 编译):

extern unsigned char const mySymbolName[16] ;

有关详细信息,请参阅 Ben Voigt answer to a question on const semantics I asked不久前。

关于C/symbol 中的 const 数组在使用 nm 编译的 *.o 文件中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19680633/

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