在(模拟)PPC64 Linux上的backtrace()segfaults

时间:2019-08-28 08:41:23

标签: docker segmentation-fault qemu powerpc backtrace

我在文件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(实际上是Mac 2.1.0.1的Docker桌面),因此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也没有区别。)

1 个答案:

答案 0 :(得分:1)

同意这是一个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]