2017-09-05 49 views
0

我想了解命令行参数如何工作的细节。命令行参数是否会“传递两次”?

这就是我的想法发生了:

  • 当您编译包含在C main()功能的源代码,生成的目标文件将与CRT相连,且入口点计划将会是_start()函数(它存在于CRT中),并且_start()将会调用main()

  • 现在,当你运行你的程序,并通过它的一些命令行参数,命令行参数将被传递给_start()功能,然后_start()将重新通过命令行参数main()

我正确吗?

+1

“...程序的入口点将是”main“函数。其他任何东西都与你的C程序无关。如果你想深入一点,这与C无关,但仅限于你的平台。使用Linux,阅读crt和加载程序的源代码,并单步执行一个简单的程序。在这里解释这一切显然太广泛了。 – Olaf

+0

传递表示参数数组和参数数的指针。参数本身由运行时处理。 – jxh

+0

解释命令行的shell将解析参数并填充参数数组。然后它通过一个编译器特定的方法(将它们放在堆栈上,或者更有可能在调用main之前用这些值填充寄存器)传递count和指向main的指针。 – blackghost

回答

4

我说得对吗?

是的,没有:

_start()功能是不是C函数,但汇编函数。原因在于CPU不处于C程序所需的“状态”,所以_start()函数也必须设置用于执行C代码的CPU。

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

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

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

+0

x86-64就流程入口的堆栈布局而言,Linux与i386基本相同。不过,argc和指针是64位宽。 ABI会记录详细信息。 https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI –