(模拟)PPC64 上的 backtrace() 段错误 Linux
backtrace() segfaults on (emulated) PPC64 Linux
我在文件 backtrace.c
中创建了以下测试程序:
#include <stdio.h>
#include <stdlib.h>
#include <execinfo.h>
int main(int argc,char**argv){
void *stack[128];
int frameCount = backtrace(stack, sizeof stack);
char **symbols = backtrace_symbols(stack, frameCount);
printf("Backtrace: %d frames\n", frameCount);
for (int i = 0; i < frameCount; i++) {
printf("\t%s\n", symbols[i]);
}
free(symbols);
return 0;
}
然后我用下面的脚本在i386,amd64,arm32v5,arm64v8和
s390x Debian Linux Docker 容器:
for arch in i386 amd64 arm32v5 arm32v7 arm64v8 s390x; do
echo "=== $arch ==="
docker run -w /work -v $(pwd -P):/work $arch/debian /bin/bash -c "apt-get update && apt-get install -y gcc && gcc -funwind-tables -o backtrace backtrace.c && ./backtrace"
done
(注意 -funwind-tables
需要在 arm32v5 上获取任何帧。在其他架构上,它不是必需的,但不会造成伤害。)
主机 CPU 架构是 amd64(实际上 Docker Desktop for Mac 2.1.0.1)所以 arm* 和 s390x 容器由 QEMU 用户仿真通过 binfmt_misc.
无论如何,我在 ppc64le 上做了同样的事情,它出现了段错误:
arch=ppc64le
docker run -w /work -v $(pwd -P):/work $arch/debian /bin/bash -c "apt-get update && apt-get install -y gcc && gcc -funwind-tables -o backtrace backtrace.c && ./backtrace"
为什么它在 ppc64le 上不起作用?是关于 gcc 标志的吗? (我尝试使用和不使用 -funwind-tables
,无论哪种方式都会出现段错误。添加 -fasynchronous-unwind-tables
也没有任何区别。)
同意这是一个 qemu 错误。
它在裸机上的工作原理如下:
danielgb@talos2:~$ gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
danielgb@talos2:~$ uname -a
Linux talos2 5.3.0-19-generic #20~18.04.2-Ubuntu SMP Tue Oct 22 18:08:01 UTC 2019 ppc64le ppc64le ppc64le GNU/Linux
danielgb@talos2:~$ gcc -funwind-tables -o backtrace backtrace.c
danielgb@talos2:~$ ./backtrace
Backtrace: 3 frames
./backtrace(+0x9c0) [0x84a0de609c0]
/lib/powerpc64le-linux-gnu/libc.so.6(+0x2441c) [0x7ed19cfa441c]
/lib/powerpc64le-linux-gnu/libc.so.6(__libc_start_main+0xb8) [0x7ed19cfa4618]
我在文件 backtrace.c
中创建了以下测试程序:
#include <stdio.h>
#include <stdlib.h>
#include <execinfo.h>
int main(int argc,char**argv){
void *stack[128];
int frameCount = backtrace(stack, sizeof stack);
char **symbols = backtrace_symbols(stack, frameCount);
printf("Backtrace: %d frames\n", frameCount);
for (int i = 0; i < frameCount; i++) {
printf("\t%s\n", symbols[i]);
}
free(symbols);
return 0;
}
然后我用下面的脚本在i386,amd64,arm32v5,arm64v8和 s390x Debian Linux Docker 容器:
for arch in i386 amd64 arm32v5 arm32v7 arm64v8 s390x; do
echo "=== $arch ==="
docker run -w /work -v $(pwd -P):/work $arch/debian /bin/bash -c "apt-get update && apt-get install -y gcc && gcc -funwind-tables -o backtrace backtrace.c && ./backtrace"
done
(注意 -funwind-tables
需要在 arm32v5 上获取任何帧。在其他架构上,它不是必需的,但不会造成伤害。)
主机 CPU 架构是 amd64(实际上 Docker Desktop for Mac 2.1.0.1)所以 arm* 和 s390x 容器由 QEMU 用户仿真通过 binfmt_misc.
无论如何,我在 ppc64le 上做了同样的事情,它出现了段错误:
arch=ppc64le
docker run -w /work -v $(pwd -P):/work $arch/debian /bin/bash -c "apt-get update && apt-get install -y gcc && gcc -funwind-tables -o backtrace backtrace.c && ./backtrace"
为什么它在 ppc64le 上不起作用?是关于 gcc 标志的吗? (我尝试使用和不使用 -funwind-tables
,无论哪种方式都会出现段错误。添加 -fasynchronous-unwind-tables
也没有任何区别。)
同意这是一个 qemu 错误。
它在裸机上的工作原理如下:
danielgb@talos2:~$ gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
danielgb@talos2:~$ uname -a
Linux talos2 5.3.0-19-generic #20~18.04.2-Ubuntu SMP Tue Oct 22 18:08:01 UTC 2019 ppc64le ppc64le ppc64le GNU/Linux
danielgb@talos2:~$ gcc -funwind-tables -o backtrace backtrace.c
danielgb@talos2:~$ ./backtrace
Backtrace: 3 frames
./backtrace(+0x9c0) [0x84a0de609c0]
/lib/powerpc64le-linux-gnu/libc.so.6(+0x2441c) [0x7ed19cfa441c]
/lib/powerpc64le-linux-gnu/libc.so.6(__libc_start_main+0xb8) [0x7ed19cfa4618]