1
9
看起来像第3.4节 进程初始化 特别是图3.9 System V AMD64 ABI 准确描述你想知道的。 |
2
8
尽管公认的答案已经足够了,但我还是想给出一个明确的答案,因为还有一些其他的答案可能会让人困惑。 最重要的(有关更多信息,请参阅下面的示例):在x86-64中,命令行参数通过堆栈传递:
它与在x86-64中传递的函数参数不同,后者使用
还有一件事:我们不应该从C的逆向工程中推断出行为。
没有带-nostdlib的C运行时/gcc 让我们检查一下这个简单的x86-64汇编程序,它只返回42:
我们用以下方法构建它:
或与
在GDB中运行
在断点处停止
什么也没有。那烟囱呢?
所以栈中的第一个元素是
如预期的那样,它是第一个命令行参数。 因此,有实验证据表明,命令行参数是通过x86-64中的堆栈传递的。但是,只有通过阅读 ABI (正如公认的答案所建议的那样)我们可以肯定,事实确实如此。 用C运行时
我们必须稍微改变程序,重新命名
我们使用(默认情况下使用C运行时)构建它:
在GDB中运行
在断点处停止
看起来不熟悉。还有注册?
我们可以看到
但是等等,第二个论点
现在我们找到了我们的参数,它们通过寄存器传递,就像x86-64中的普通函数一样。 结论: 正如我们所看到的,这是关于使用C运行时的代码与不使用C运行时的代码之间的命令行参数传递的区别。 |
3
1
我相信你需要做的是检查 x86-64 ABI . 具体来说,我认为您需要查看第3.2.3节参数传递。 |
CaTx · 使用带有一个大于号和两个大于号的回波的区别 2 年前 |
Ari157 · x86_64 Linux程序集中的逻辑与实现 2 年前 |
Ty Q. · 分段故障GLFW3/GLAD 2 年前 |
ShortArrow · 如何使用git管理链接源文件? 2 年前 |
Bastien L. · 多Linux Grafana集成 2 年前 |