gpt4 book ai didi

gcc - 如何设置 2 字节 wchar_t 输出?

转载 作者:行者123 更新时间:2023-12-04 22:47:13 28 4
gpt4 key购买 nike

GCC 使用 4 字节 wchar_t默认情况下。我可以设置选项 -fshort-wchar每个 wchar_t 获得 2 个字节在 L"string constants" .但是当我将编译器选项设置为我的源文件时,我收到了著名的警告消息

foo.o uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may fail



因为我真的想要 2 字节 wchar_t我还希望输出使用此变体。是否有任何链接器选项可以告诉它我想要什么?

编辑

此警告不会禁止链接器产生有效的输出。但数十个错误警告涵盖​​了其他信息。

最佳答案

在 binutils 中,您可以在 bfd/elf32-arm.c 中找到此错误消息。作为:

"warning: %B uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; use of wchar_t values across objects may fail"



但是,如果您进一步查看 binutils,您会发现输出的 wchar_t 大小并未在任何地方初始化为 4。那么是什么决定了“输出 wchar_t 大小”呢?实际上,第一个对象是给 ld初始化输出属性。下一个对象将它们的属性合并到其中。如果你用 gcc/g++ 链接,它会执行 ld在内部,所以尝试 gcc -v看看如何 ld被执行。这将使您深入了解它隐式链接到您的可执行文件的内部对象文件(除了您自己的)。

例如,与 gcc 链接(例如 gcc -v -shared -o libfoobar.so foo.o bar.o )会导致调用:
ld ... crtbegin_so.o foo.o bar.o crtend_so.o ...
即以下对象实际上是链接的(按顺序):
  • crtbegin_so.o(隐式)
  • foo.o
  • bar.o
  • crtend_so.o(隐式)

  • 这是 ld 的作用:
  • 输出属性集从空开始。
  • 合并 crtbegin_so.o 属性。现在输出属性包含 out_attr[Tag_ABI_PCS_wchar_t] == 4
  • 合并 foo.o 属性。如果 foo.o 是用 -fshort-wchar 构建的,然后 in_attr[Tag_ABI_PCS_wchar_t] == 2这将导致冲突和您看到的警告。

  • 如果您要在 ld 命令行上交换 crtbegin_so.o 和 foo.o,则会收到以下警告:

    ld: warning: android-ndk-r9d/platforms/android-16/arch-arm/usr/lib/crtbegin_so.o uses 4-byte wchar_t yet the output is to use 2-byte wchar_t; use of wchar_t values across objects may fail



    如您所见,这不是输入与输出不兼容的问题,而是(感知到的)链接在一起的两个目标文件之间的不兼容问题。

    我们对于它可以做些什么呢?
  • As of 2008 , ld支持 --no-wchar-size-warning标志以抑制此警告。但是正如你所说,不加区别地压制警告有其弊端。
  • 您可以使用 -fshort-wchar 重建您的工具链。
  • 您可以剥离 Tag_ABI_PCS_wchar_t如果您真的相信它们是来自内部 gcc 对象二进制文件的标签 sizeof(wchar_t) -不可知论者。这可能比重建工具链更容易。为此,您可以使用 this utility我曾经写过。 (您可能需要解压 libgcc.a,更改其目标文件并重新打包。)
  • 关于gcc - 如何设置 2 字节 wchar_t 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19489354/

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