-
-
[求助]linker中查看exec格式的elf文件符号出现段错误
-
发表于: 2013-8-29 15:09 5273
-
这两天准备看一下android的linker执行过程, 写了个测试程序trace一下, 但发现在linker加载完elf文件后,查找加载后的符号,不能读符号的内容,一读就有段错误。
同样的方法, 查看DYN的so文件不会出现段错误, 但查看EXEC的可执行文件会出现段错误
这里还有些比较奇怪的是, 自己写的测试程序的maps信息,可执行程序是从0x00008000开始加载的, 但我在android环境下编写的服务程序,是从
测试程序maps信息:
00008000-00015000 r-xp 00000000 5d:20 281 /data/test
00015000-00016000 rwxp 0000c000 5d:20 281 /data/test
00016000-00019000 rwxp 00000000 00:00 0
...
(在这个环境中,从linker中查看全局变量的值就出现段错误, 用gdbserver查看,同样的地址,没有段错误)
android程序maps信息:
root@android:/ # cat /proc/1682/maps
400a2000-400a8000 r-xp 00000000 5d:10 99 /system/bin/PolicyCollection
400a8000-400a9000 rw-p 00000000 00:00 0
400a9000-400aa000 r--p 00006000 5d:10 99 /system/bin/PolicyCollection
400aa000-400ab000 rw-p 00000000 00:00 0
400ab000-400bc000 r-xp 00000000 5d:10 173 /system/bin/linker
....
Android下边的可执行程序,其类型依旧是 DYN(shared object file)
两种情况下,为何加载地址是不一样的?
这里看起来是:静态链接的,在linker中查看值就挂,动态链接的,在linker中可以查看值。两种格式的ELF文件都能在linker中查找和定位到符号。
为何会出现这种情况?
同样的方法, 查看DYN的so文件不会出现段错误, 但查看EXEC的可执行文件会出现段错误
这里还有些比较奇怪的是, 自己写的测试程序的maps信息,可执行程序是从0x00008000开始加载的, 但我在android环境下编写的服务程序,是从
测试程序maps信息:
00008000-00015000 r-xp 00000000 5d:20 281 /data/test
00015000-00016000 rwxp 0000c000 5d:20 281 /data/test
00016000-00019000 rwxp 00000000 00:00 0
...
(在这个环境中,从linker中查看全局变量的值就出现段错误, 用gdbserver查看,同样的地址,没有段错误)
android程序maps信息:
root@android:/ # cat /proc/1682/maps
400a2000-400a8000 r-xp 00000000 5d:10 99 /system/bin/PolicyCollection
400a8000-400a9000 rw-p 00000000 00:00 0
400a9000-400aa000 r--p 00006000 5d:10 99 /system/bin/PolicyCollection
400aa000-400ab000 rw-p 00000000 00:00 0
400ab000-400bc000 r-xp 00000000 5d:10 173 /system/bin/linker
....
Android下边的可执行程序,其类型依旧是 DYN(shared object file)
两种情况下,为何加载地址是不一样的?
这里看起来是:静态链接的,在linker中查看值就挂,动态链接的,在linker中可以查看值。两种格式的ELF文件都能在linker中查找和定位到符号。
为何会出现这种情况?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
看原图
赞赏
雪币:
留言: