首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qemu:当试图返回一个结构时,隐藏的目标信号11 (分割故障)-核被抛出

qemu:当试图返回一个结构时,隐藏的目标信号11 (分割故障)-核被抛出
EN

Stack Overflow用户
提问于 2020-01-30 13:04:38
回答 2查看 6.7K关注 0票数 1

我刚刚注意到,我无法让一个函数返回一个结构。

我在启用线程的am 32/debian坞映像上运行这个程序。

这是给出运行时错误的函数:

代码语言:javascript
复制
struct CEC_call des_CEC_call(char * buffy){

    char request        =   buffy[0];   //  fails here
    buffy+=4;

    char obligation     =   buffy[1];
    buffy+=4;

    struct CEC_call ceccall;
    pepcall.request     = request;
    pepcall.obligation  =   obligation;

    return ceccall;

}  

但是,如果我将返回类型更改为void,则运行中没有问题:

代码语言:javascript
复制
void des_CEC_call(char * buffy){

    char request        =   buffy[0];   //  doesn't fail here
    buffy+=4;

    char obligation     =   buffy[1];
    buffy+=4;

    struct CEC_call ceccall;
    pepcall.request     = request;
    pepcall.obligation  =   obligation; 

}

对于任何标准的返回类型,返回都可以很好地工作。

定义了结构的标题包含在带有函数的文件中,尽管即使在同一个文件中定义了结构,它仍然会崩溃。不知道如何继续调试,任何帮助都很感激。

编辑:

更多细节,根据评论中的建议:

我已经在我的mac上重新运行了相同的程序,以及其他一些带有docker的非arm架构,而且它运行时没有任何明显的问题。与比特移位有关的一些方面与预期略有不同,但与分割错误没有运行时错误。我试着用不同的优化级别运行它,但没有结果。

我以前使用过GDB,所以我认为这可能会提供一些洞察力,遗憾的是,我还无法让它在这个容器上工作。

我确保安装GDB并使用-0g重新编译二进制文件。

我和--cap-add=SYS_PTRACE--security-opt seccomp=unconfined一起跑码头。

每次我得到:

代码语言:javascript
复制
warning: Could not trace the inferior process.
Error: 
warning: ptrace: Function not implemented
During startup program exited with code 127.

我可以使用GDB与其他非手臂,非32位对接图像,没有任何问题。我认为这足以解决另一个问题,因为我花了很长时间试图让GDB处理这个环境。

我并不确定如何进行其他验证,但我已经打印出了buffy所指向的地址和buffy[0]在前面函数中所持有的值以及有问题的函数。

没有结构返回:

代码语言:javascript
复制
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff

与struct返回:

代码语言:javascript
复制
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = (nil)
qemu: uncaught target signal 11 (Segmentation fault) - core dumped

Struct CEC_call没有任何其他字段。它可能是某个地方的缓冲区溢出,但没有任何缓冲区--至少没有由我制造的缓冲区。我以前没有使用过QEMU IIRC或valingrad,但是我会更详细地研究它们。我现在不能自然地进行测试,因为我无法访问预定的嵌入式linux。

EN

回答 2

Stack Overflow用户

发布于 2020-02-02 21:30:38

代码语言:javascript
复制
struct CEC_call ceccall;
pepcall.request     = request;
pepcall.obligation  =   obligation;

似乎您的变量名称不匹配:ceccallpepcall,并且返回一个未初始化的变量ceccall

票数 1
EN

Stack Overflow用户

发布于 2020-02-05 15:42:55

我的问题是,获得struct CEC_call des_CEC_call(char * buffy)函数声明的文件的头没有包含在调用文件中。

如果函数返回标准类型或空值,则调用它可以正常工作,但是使用自定义结构返回传入的数组指针将为空。这种情况一开始让我感到困惑,因为我不认为它会因为缺少声明而编译,而且这个分段错误只发生在arm32体系结构上,我没有在OSX上遇到那样的崩溃。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59986709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档