You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++链接x86-64汇编函数后出现stack smashing detected错误?

问题分析与解决

问题描述

尝试将x86-64汇编函数与C++代码链接,交换功能正常,但程序执行结束时触发栈破坏错误:

3 4 
a: 3 b: 4
a: 4 b: 3
*** stack smashing detected ***: terminated
Aborted (core dumped)

汇编代码

.text 

.global _Z7scambiaRiS_

_Z7scambiaRiS_:
    pushq %rbp
    mov %rsp, %rbp

    mov (%rdi), %rax
    mov (%rsi), %rcx
    mov %rcx, (%rdi)
    mov %rax, (%rsi)

    leave
    ret

.data

C++代码(原始错误版本)

#include <iostream>

void extern scambia(int &a, int &b);

int main()
{ 
    int a, b;
    std::cin>>a>>b;
    std::cout<<"a: "<<a<<" b: "<<b<<"
";
    
    scambia(a, b);

    std::cout<<"a: "<<a<<" b: "<<b<<"
";
    
    return 0;
};

错误原因

  1. C++语法错误:代码中std::cout的字符串字面量包含未转义的换行符(直接在双引号内换行),违反C++语法规范。编译器处理这类错误时可能生成非法代码,破坏栈上的保护校验值(触发GCC的-fstack-protector机制报错)。
  2. 编译模式不匹配:若汇编代码以32位模式编译,却链接到64位C++程序,会导致栈操作逻辑不兼容,破坏栈结构。

解决方案

1. 修正C++代码的语法错误

将字符串中的直接换行改为转义符\n,并调整extern声明的规范顺序:

#include <iostream>

extern void scambia(int &a, int &b);

int main()
{ 
    int a, b;
    std::cin>>a>>b;
    std::cout<<"a: "<<a<<" b: "<<b<<"\n";
    
    scambia(a, b);

    std::cout<<"a: "<<a<<" b: "<<b<<"\n";
    
    return 0;
}

2. 确保编译模式一致

使用64位模式编译汇编与C++代码:

  • 汇编编译命令:as -m64 scambia.s -o scambia.o
  • C++编译链接命令:g++ -m64 main.cpp scambia.o -o swap

3. 简化汇编代码(可选)

由于该函数是叶函数(不调用其他函数),可省略栈帧操作,简化为:

.text 
.global _Z7scambiaRiS_

_Z7scambiaRiS_:
    mov (%rdi), %rax
    mov (%rsi), %rcx
    mov %rcx, (%rdi)
    mov %rax, (%rsi)
    ret

这样既保证功能正确,又避免栈帧操作可能带来的潜在问题。

内容的提问来源于stack exchange,提问作者drok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:53:12