1 2 |
|
/usr/lib/rpm/debugedit 用来改变源码查找路径。
1 2 3 4 5 6 7 8 9 10 11 |
|
base-dir 长度要大等于 dest-dir
-i 输出build-id
-l 输出源编译文件位置,便于有需要的人打包
debugedit 会在.debug_info .debug_abbrev .debug_line .debug_str中将base_dir目录替换为dest_dir目录。
* 需要注意,如果base_dir是路径中除文件名的部分,则.debug_line中的The Directory Table的目录和.debug_info中的DW_AT_comp_dir(指向.debug_str的内容)不会替换。
如:
.debug_line中的Table中有一个目录为/root/Desktop
,如果用 -b /root/Desktop
则匹配不上这条。
* 因为:debugedit在匹配的时候在base_dir和dest_dir后面加了一个'/‘
其他部分能替换是因为他们存的是文件路径,不是文件夹路径
内核处理debuginfo的时候,只会替换DW_AT_comp_dir。因为DW_AT_name是一个相对地址
可以修改debugedit源码,base_dir、dest_dir后面不再默认添加'/‘,只是单纯的把base_dir替换成dest_dir
http://vault.centos.org/6.7/os/Source/SPackages/rpm-4.8.0-47.el6.src.rpm
http://vault.centos.org/5.11/updates/SRPMS/rpm-4.4.2.3-36.el5_11.src.rpm
删除tool/debugedit.c中的下面代码即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
debugedit -l在输出.debug_line的时候会去除base_dir、dest_dir前缀,由于他们不是以/
结尾,所以输出的文件会以/
开头,类似/net/ipv4/tcp_input.c
,下一步按这个目录去copy文件时就copy不到。所以应该把开头的/
去掉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
.debug_str段保存着所有全局变量的名字,以0x00作为每一个全局变量名的结束。
在其它段来调用名字时,是以其在.debug_str段的偏移量来实现的
gcc -g /root/Desktop/a.c -o /root/Desktop/a.out
用绝对路径编译,在.debug_str段中就会存下源文件路径,.debug_info的DW_TAG_compile_unit中的DW_AT_name对应.debug_str中的偏移。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1
|
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|