所以,我的愚蠢问题是,在运行Centos 6.6并使用Bash shell的系统上,当从命令提示符调用程序时,究竟是什么打开argv [0]来执行?
我已经尝试过(我认为被称为)截取程序,并通过LD_PRELOAD指令导出共享对象文件,并且可以至少跟踪一些对" open"的调用。和" open64"。
我使用的调试样式打印语句给我打开了文件名但是我注意到从命令行调用的程序(我假设是argv [0])看起来并不像是由其中任何一个引用。
这导致我开始闯入bash源而没有取得任何实际进展。
我非常感谢有关我可能需要寻找什么以及在哪里的任何指示?我对argv,argv(,main(,execev,ioctl和fcntl,google搜索和搜索的留言板)进行了grep'但我没有取得进展。
我非常感谢任何建议或指示。
答案 0 :(得分:5)
获取bash
的来源(注意:它不是一个简单的shell - 这是一个非常复杂的程序):
git clone git://git.savannah.gnu.org/bash.git
。 查看文件execute_cmd.c
以及函数execute_disk_command()
和shell_execve()
。
基本上execute_disk_command()
执行fork()
(通过帮助函数make_child()
,后跟execve()
(通过shell_execve()
)。
答案 1 :(得分:3)
最终,execve()
是所有程序调用的入口点(在POSIX兼容平台上)。它指示操作系统运行加载程序,该加载程序准备新程序以便执行并最终使其进入运行状态(并将其留给自身)。提供给execve()的一个参数是字符串 - 指向磁盘上可执行文件的文件系统路径。按照惯例,argv [0]设置为相应的基名*。参数被放置在新生成的程序的堆栈上,以便它可以访问它们。
请参阅http://linux.die.net/man/2/execve:
int execve(const char * filename,char * const argv [],char * const envp []);
execve()执行 filename 指向的程序。文件名必须是 二进制可执行文件,或以一行开头的脚本 形式:
#! interpreter [optional-arg]
argv是传递给新程序的参数字符串数组。通过 约定,这些字符串中的第一个应该包含文件名 与正在执行的文件相关联。