我正在学习使用gdb,我有点困惑。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void g(char *password) {
}
int main(int argc, char *argv[]) {
if(argc > 1)
{
g(argv[1]);
}
}
所以使用常规函数(本例中为g()
)如果我想检查函数参数,那就是ebp + 8 , ebp+12.. etc. But in
main function when I'm trying to examine command line arguments (for example
argv [1]`)看来,在这种情况下,先前检查参数的方法并不成功。所以我的问题是:
malloc
)?argv
本身的地址?(使用&#34; A&#34;它是0xbffff084
但是使用&#34; A&#34; x10它是{ {1}})0xbffff074
离ebp这么远?(在我的情况下,当我提供argv
作为命令行参数时,ebp出现在0xbfffefe8
和argv
0xbffff084
中)答案 0 :(得分:2)
也许这澄清了。在使用GCC和GAS组装相同的代码时发现了这一点:
# GCC
# Stack is:
#ESP -> ret addr
# argc
# argv -> argv[0] -> "program name"
# argv[1] -> "Key"
# argv[2] -> "Infile"
# argv[3] -> "Outfile"
# GAS
# Stack is:
#ESP -> argc
# argv[0] -> "program name"
# argv[1] -> "Key"
# argv[2] -> "Infile"
# argv[3] -> "Outfile"
我记得&#34; argv-list&#34;由操作系统构建。
答案 1 :(得分:1)
不,内存不是动态分配的。在main
(_start
)之前的函数中,argv
和argc
被推入堆栈以供main
使用
地址的变化与参数的数量无关。它可能是另一个过程中蝴蝶翅膀的击球导致了这个
这是依赖于实现的。这很难说。但是你可以在GDB中运行这个命令来亲眼看看:
disass _start
^^^
答案 2 :(得分:1)
函数参数是argv
,是一个普通参数,与任何其他类型为char**
的参数一样。 argv[1]
不是函数参数,它是argv
的偏移和解引用,您会在预期的位置找到 (这取决于目标ABI)。