【问题标题】:GCC: i386 architecture of input file `../window.ui.o' is incompatible with i386:x86-64 outputGCC:输入文件 `../window.ui.o' 的 i386 架构与 i386:x86-64 输出不兼容
【发布时间】:2019-01-18 12:03:53
【问题描述】:

我正在尝试将一个名为 window.ui 的文件嵌入到我的 C 可执行文件中,目的是稍后从代码中访问内容:

objcopy --input binary \
        --output elf32-i386 \
        --binary-architecture i386 ../src/window.ui ../window.ui.o

gcc `pkg-config --cflags gtk+-3.0` \
    ../src/*.c \
    ../*.o \
    `pkg-config --libs gtk+-3.0` \
    -o ../a.out

编译时,GCC 失败并出现以下错误:

/usr/bin/x86_64-linux-gnu-ld: i386 architecture of input file `../window.ui.o' is incompatible with i386:x86-64 output
collect2: error: ld returned 1 exit status

有没有办法强制 GCC 仍然包含该文件?

我也试过objcopy--output elf64-x86-64,编译正确但是阅读时内容是乱码。


原来guide给了我灵感

【问题讨论】:

  • 你是如何创建window.ui.o的?链接器需要地址信息才能将其放入可执行文件中。
  • @FiddlingBits 我正在使用问题中提到的objcopy --input binary --output elf32-i386 --binary-architecture i386 ../src/window.ui ../window.ui.o 命令创建window.ui.o
  • ... 什么 window.ui?我完全不明白你为什么使用objcopy
  • @TypeIA window.ui 是一个用于 Gtk 的 UI 设计的 XML 文件。我正在尝试将它嵌入到可执行文件中,因为它在运行时需要。
  • 我明白了。这是一种非常邪恶的嵌入资源的方法。链接器的输入文件都必须具有相同的架构。您的系统是 x86_64,这就是 ld 试图为其生成输出,但您给它的是 i386 输入。将--output 标志更改为objcopyx86-64,您应该会得到更好的结果。

标签: c linux gcc


【解决方案1】:

通过使用 gnu-ld 来“解决”:

ld -r -b binary ../src/window.ui -o ../window.ui.o

无法弄清楚为什么 objcopy 不起作用。

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2020-06-18
    • 2011-10-25
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多