0

我试图让 fbounds 检查工作,但我没有成功。我收到以下错误:

/tmp/cczxKZzn.s:汇编程序消息:

/tmp/cczxKZzn.s:48:错误:“push”的指令后缀无效

/tmp/cc9xD8T3.s:125:错误:“pop”的指令后缀无效

虽然我的makefile看起来像这样(使用简单的makefile,一切都在正确编译):

all: error check

error: error.c
    /usr/local/gcc-4.0.2/bin/gcc -fbounds-checking -g -Wall -pedantic $< -o $@

.PHONY: clean check

clean:
    -rm error

check:  error
    ./error

由于该代码与汇编程序无关,我不知道该怎么做。汇编器问题是我在谷歌搜索该主题时唯一能看到的问题。


您能否提出其他解决方案,例如检查是否位于数组之外?如(这是我的error.c):

#include <stdio.h>
#include <stdlib.h>
int main()
{
  int a[1][10];
  a[0][11]=42;
  return 0;
}

编辑。会不会是版本不兼容?已安装 gcc 4.4+ 并且我正在使用经过一点修改的 gcc 4.0.2 的路径来执行此操作?

4

2 回答 2

1

由于该代码与汇编程序无关,我不知道该怎么做。汇编器问题是我在谷歌搜索该主题时唯一能看到的问题。

看起来你调用了错误的汇编器——一个 32 位的,试图编译一个 64 位的目标代码。检查您的路径和标志。

更新:我从来没有研究过 gcc 是如何调用它的组件的。我还不是很清楚。无论如何,它看起来不像我相信的那样依赖于 PATH,而是依赖于它的 ./configure 设置(--prefix、--build 等等)。

我的, --prefix=/usr--build=x86_64-suse-linux, --program-suffix=-4.6 , looks for its components in (with respect to the directory where thegcc` 二进制文件驻留在: - ../lib64/gcc/x86_64-suse-linux/4.6 - ../lib64/gcc/ - ../lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/bin/x86_64-suse-linux/4.6/ - ../lib64/ gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/bin/

(检查strace)。

如果其中一个目录中存在来自另一个 gcc 的二进制文件,它将被调用而不是“正确”的那个。

尝试用gcc -v(或用strace)检查哪个as正在运行。

于 2012-08-22T21:48:15.643 回答
0

如果有人仍然需要用这个古老的 gcc 版本运行边界检查:你能做的最好的就是告诉它把相关的参数传递给汇编器-Wa,--32,所以你需要这个:

error: error.c
    /usr/local/gcc-4.0.2/bin/gcc -fbounds-checking -Wa,--32 -g -Wall -pedantic $< -o $@

背景信息:您的古老 gcc 生成 32 位程序集,而您的现代汇编程序默认为 64 位。对于大多数指令来说这不是问题,因为通常 32 位寄存器操作在 64 位模式下,推送和弹出是例外:它们不支持 64 位模式下的 32 位操作数。

于 2020-04-22T11:39:30.993 回答