Linux应用程序的虚拟地址修改

时间:2014-06-28 07:09:59

标签: linux executable elf

我试图了解Linux中不同应用程序的流程。

我追踪了两个不同程序的执行情况(使用英特尔&#39的pintool)。

  1. 我写的Hello world程序。
  2. scp实用程序。
  3. 两个程序的objdump显示不同范围内的指令地址。

    HelloWorld的执行跟踪(包含虚拟地址)给出的指令地址可以在其objdump 中看到,而 scp的执行跟踪中的指令地址不会在scp的objdump中看到。

    scp应用程序位于/ usr / bin目录中。我观察到与位于/ usr / bin中的另一个应用程序(ab-apache基准测试)类似的anamoly。

    那些目录中的应用程序是否专门加载? 找到应用程序加载地址的方法是什么?

1 个答案:

答案 0 :(得分:1)

  

这些目录中的应用程序是否专门加载

没有

scp的大部分执行时间可能不在scp二进制文件本身,而是在libc.so.6vdso内(你应该仍然< / em>请参阅主二进制文件中的一些说明。

另一种可能的解释是,您的发行版上的scp被构建为与位置无关的可执行文件(与-pie标志链接)。您可以通过查看readelf -h /usr/bin/scp来查明或反驳该理论(查找文件类型,ET_EXECET_DYN)。

更新

  

readelf命令说/ / usr / bin / scp

的DYN(共享对象文件)

所以我的猜测是正确的,这是一个与位置无关的二进制文件。

  

我有办法确定基地址(执行时)

当然:你可以:

  • /proc/<pid-of-scp>/maps中查看/usr/bin/scp与执行保护的第一个映射,或
  • 通过scp将GDB附加到gdb -p <pid-of-scp>并使用info file
  • 教你的pin工具转储映射(pin已经在跟踪你的过程,所以我相信你只需要在完成mmap时打印所需的信息。)