命令行参数是否会“传递两次”?
我想了解命令行参数如何工作的细节。命令行参数是否会“传递两次”?
这就是我的想法发生了:
当您编译包含在C
main()
功能的源代码,生成的目标文件将与CRT相连,且入口点计划将会是_start()
函数(它存在于CRT中),并且_start()
将会调用main()
。现在,当你运行你的程序,并通过它的一些命令行参数,命令行参数将被传递给
_start()
功能,然后_start()
将重新通过命令行参数main()
。
我正确吗?
我说得对吗?
是的,没有:
的_start()
功能是不是C函数,但汇编函数。原因在于CPU不处于C程序所需的“状态”,所以_start()
函数也必须设置用于执行C代码的CPU。
调用_start()
时,C程序所需的“状态”与CPU的“状态”之间的一个区别是存储参数(这里是:命令行参数)的方式。
在Linux下(至少32位 - 我不知道大约64位),你实际上有一个数组,后来代表argv
。 _start()
必须计算argv
的位置,然后将计算的值传递给main()
。
在Windows下,有一个函数返回整个命令行作为指向单个字符串的指针(const char *
)! _start()
函数必须调用该函数,然后将字符串拆分为以后将成为argv
的零件...
x86-64就流程入口的堆栈布局而言,Linux与i386基本相同。不过,argc和指针是64位宽。 ABI会记录详细信息。 https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI –
“...程序的入口点将是”main“函数。其他任何东西都与你的C程序无关。如果你想深入一点,这与C无关,但仅限于你的平台。使用Linux,阅读crt和加载程序的源代码,并单步执行一个简单的程序。在这里解释这一切显然太广泛了。 – Olaf
传递表示参数数组和参数数的指针。参数本身由运行时处理。 – jxh
解释命令行的shell将解析参数并填充参数数组。然后它通过一个编译器特定的方法(将它们放在堆栈上,或者更有可能在调用main之前用这些值填充寄存器)传递count和指向main的指针。 – blackghost