相关疑难解决方法(0)

为什么这个独立程序会出现段错误?

我发现了一个我无法解释的有趣行为。我编写了这个非常简单的程序,它在没有明显原因的情况下出现了段错误。请问,有人可以解释一下这里发生了什么吗?

  • 该程序在 Ubuntu 中运行(我不知道这是否重要)。
  • 没有包含,没有库,没有到 stdlib 的链接。没有任何依赖关系。

我已经测试过,当发生以下任何一种情况时,段错误就会消失:

  • stdlib 已链接(并重命名_startmain、删除了 extern "C" 等)
  • 使用海湾合作委员会
  • 优化已启用

以下是该程序唯一的代码文件,我们称之为main.cpp.

构建它clang main.cpp -nostdlib

struct A
{
    A () = default;
    A (const A &) = default;
    // A (A &) = default;

    char * a = nullptr;
    unsigned long long b;
};

struct ConvertibleToA
{
    ConvertibleToA() = default; // default constructor
    operator A() { return m_a; } // conversion to type A
    A m_a;
};

extern …
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
80
查看次数

如何使用没有Glibc的C中的内联汇编来获取参数值?

如何使用没有Glibc的C中的内联汇编来获取参数值?

我需要这个代码用于Linuxarchecture x86_64i386.如果你知道MAC OS X或者Windows,也提交并请指导.

void exit(int code)
{
    //This function not important!
    //...
}
void _start()
{
    //How Get arguments value using inline assembly
    //in C without Glibc?
    //argc
    //argv
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

新的更新

https://gist.github.com/apsun/deccca33244471c1849d29cc6bb5c78e

#define ReadRdi(To) asm("movq %%rdi,%0" : "=r"(To));
#define ReadRsi(To) asm("movq %%rsi,%0" : "=r"(To));
long argcL;
long argvL;
ReadRdi(argcL);
ReadRsi(argvL);
int argc = (int) argcL;
//char **argv = (char **) argvL;
exit(argc);
Run Code Online (Sandbox Code Playgroud)

但它仍然返回0.所以这段代码错了!请帮忙.

c assembly x86-64 i386

2
推荐指数
3
解决办法
624
查看次数

标签 统计

assembly ×1

c ×1

c++ ×1

i386 ×1

x86-64 ×1