我试图了解Linux中不同应用程序的流程。
我追踪了两个不同程序的执行情况(使用英特尔&#39的pintool)。
两个程序的objdump显示不同范围内的指令地址。
HelloWorld的执行跟踪(包含虚拟地址)给出的指令地址可以在其objdump 中看到,而 scp的执行跟踪中的指令地址不会在scp的objdump中看到。
scp应用程序位于/ usr / bin目录中。我观察到与位于/ usr / bin中的另一个应用程序(ab-apache基准测试)类似的anamoly。
那些目录中的应用程序是否专门加载? 找到应用程序加载地址的方法是什么?
答案 0 :(得分:1)
这些目录中的应用程序是否专门加载
没有
scp
的大部分执行时间可能不在scp
二进制文件本身,而是在libc.so.6
和vdso内(你应该仍然< / em>请参阅主二进制文件中的一些说明。
另一种可能的解释是,您的发行版上的scp
被构建为与位置无关的可执行文件(与-pie
标志链接)。您可以通过查看readelf -h /usr/bin/scp
来查明或反驳该理论(查找文件类型,ET_EXEC
与ET_DYN
)。
更新
readelf命令说/ / usr / bin / scp
的DYN(共享对象文件)
所以我的猜测是正确的,这是一个与位置无关的二进制文件。
我有办法确定基地址(执行时)
当然:你可以:
/proc/<pid-of-scp>/maps
中查看/usr/bin/scp
与执行保护的第一个映射,或scp
将GDB附加到gdb -p <pid-of-scp>
并使用info file
或pin
已经在跟踪你的过程,所以我相信你只需要在完成mmap
时打印所需的信息。)