【问题标题】:Will the command line arguments be "passed twice"? [duplicate]命令行参数会“传递两次”吗? [复制]
【发布时间】:2017-09-06 02:43:11
【问题描述】:

我正在尝试详细了解命令行参数的工作原理。

这就是我认为会发生的事情:

  • 当你在 C 中编译包含main() 函数的源代码时,生成的目标文件将与 CRT 链接,程序的入口点将是 _start() 函数(存在在 CRT 中),_start() 将调用 main()

  • 现在,当您运行程序并传递一些命令行参数时,命令行参数将传递给_start() 函数,然后_start() 将重新传递命令行参数给@987654327 @。

我说的对吗?

【问题讨论】:

  • "... 程序的入口点将是“main 函数。其他任何东西都与您的 C 程序无关。如果您想更深入,这与 C 无关,而仅与您的平台有关。使用Linux,阅读crt和loader的源码,单步执行一个简单的程序。在这里解释所有这些肯定太宽泛了。
  • 传递参数数组的指针和参数计数。参数本身由运行时处理。
  • 解释命令行的 shell 将解析参数并填充参数数组。然后它通过编译器特定的方法将计数和指针传递给 main(或者将它们放在堆栈上,或者更有可能在调用 main 之前用这些值填充寄存器)。

标签: c linux x86


【解决方案1】:

我说的对吗?

是与否:

_start() 函数不是 C 函数,而是汇编函数。原因是 CPU 未处于 C 程序所需的“状态”,因此_start() 函数还必须设置 CPU 以执行 C 代码。

C 程序所需的“状态”与调用 _start() 时 CPU 的“状态”之间的一个区别是参数(此处为命令行参数)的存储方式。

在 Linux 下(至少 32 位 - 我不知道 64 位)你实际上有一个数组,后来代表argv_start() 必须计算argv 的位置,然后将计算的值传递给main()

在 Windows 下,有一个函数可以将整个命令行作为指向单个字符串 (const char *) 的指针返回! _start() 函数必须调用该函数,然后将字符串拆分为稍后将变为 argv...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多