【问题标题】:32-bit code runs on 64-bit linux machine32 位代码在 64 位 linux 机器上运行
【发布时间】:2015-06-20 20:14:29
【问题描述】:

我的 linux 是 64 位 Red Hat 6.5。 GCC 是 4.4.7。我有一个最初在 32 位机器上运行的代码,这意味着从指针到 int 的转换有很多。当我制作时,我得到error: cast from ‘void*’ to ‘int’ loses precision。我知道这是因为在 64 位操作系统中指针类型是 8 个字节。

我不想一一修复所有这些,因为太多了,所以我在 makefile CFLGAS 中添加了-m32 标志,它使 32 位代码在为 64 位对象配置的编译器上运行默认。

好消息是这个编译错误消失了。但是,编译器给了我这个main.o: could not read symbols: File in wrong format。似乎这仍然是 32 位和 64 位之间的一些兼容问题。谁能告诉我如何解决这个问题?

这是我用于 gmake 的 makefile.common 的一部分:

CFLAGS = -m32 -g -Wall -Wshadow $(INCPATH) $(DEFINES) $(HOST) -DCHANGED 
LDFLAGS = -m32

CPP= gcc -E -m32
CC = g++
LD = g++
AS = as --32
.......
S_OFILES = switch.o

OFILES = $(C_OFILES) $(S_OFILES)

$(PROGRAM): $(OFILES)
    $(LD) $(OFILES) $(LDFLAGS) -o $(PROGRAM)

$(C_OFILES): %.o:
    $(CC) $(CFLAGS) -c $<

【问题讨论】:

  • 除其他外,除非您的源文件实际上是使用 C++ 语言(类、迭代器、STL 调用等)编写的,否则您应该使用 gcc 而不是 g++。否则所有编译器调用都应该是 g++。注意:make 文件缺少某些项目,例如每个源文件的本地头文件依赖项。链接器按照给定的顺序获取/处理参数。所以 $(LD) $(LDFLAGS) $(OFILES) -Llibrarypath -llibrrayshortnames -o $(PROGRAM) 编译步骤应该类似于:%.o: %.c 然后 $(CC) $(CFLAGS) -c $
  • 有没有编译*.s文件的规则?
  • 你的代码一开始就很糟糕。保持原样会使未来的维护变得非常痛苦。指针不应存储为整数,如果需要,应始终存储在 intptr_tuintptr_t

标签: c++ c linux makefile 32bit-64bit


【解决方案1】:

您没有输入您的链接器 (g ++) 表明汇编代码是 32 位指令。

尝试:

CPP= gcc -E -m32
CC = g++ -m32
LD = g++ 
AS = as --32

【讨论】:

  • 如果你的意思是添加到 LD = g++ -m elf_i386,那么它给了我这个“/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../. ./../lib64/crt1.o:无法读取符号:文件格式错误”
  • 如果您知道自己的答案是错误的,请删除它而不是编辑为您的错误道歉
猜你喜欢
  • 1970-01-01
  • 2011-01-30
  • 2012-11-07
  • 2017-06-14
  • 2012-03-12
  • 1970-01-01
  • 2012-04-23
  • 2015-07-11
  • 2012-07-05
相关资源
最近更新 更多