|
|
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节参数传递。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 11 月前 |
|
|
user2138149 · 双栈网络服务器无法按预期处理ipv4请求 12 月前 |
|
|
Marco · PyCharm Linux系统文件上os.stat异常 1 年前 |