免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19994 | 回复: 9
打印 上一主题 下一主题

UNIX下*.o和*.so文件显示的stripped和not stripped是什么意思? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-19 16:03 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
2 [报告]
发表于 2007-09-19 16:23 |只看该作者
原帖由 xiaomiao 于 2007-9-19 16:03 发表
在Linux AS 4.0 for X86_64下用file命令看*.so动态库文件的格式

libnss_ldap-2.3.4.so:     ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stripped
libnss_nis-2.3.4.so:      ELF 64-bit ...


表示符号表是否被清除.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2007-09-19 16:35 |只看该作者
man strip

论坛徽章:
0
4 [报告]
发表于 2007-09-19 16:38 |只看该作者
需要提一下的是,这里strip掉的符号表不是连接器用于链接的符号表(.dynsym节),而是提供给人看的那张SYMBOL TABLE(即你用nm命令可以看到的那些符号信息)

顺便再提一下,如果你strip的是.o文件,那一切都完了,该文件就再不能被链接生成目标文件了

[ 本帖最后由 zx_wing 于 2007-9-19 16:51 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-09-19 16:55 |只看该作者
原帖由 zx_wing 于 2007-9-19 16:38 发表
需要提一下的是,这里strip掉的符号表不是连接器用于链接的符号表(.dynsym节),而是提供给人看的那张SYMBOL TABLE(即你用nm命令可以看到的那些符号信息)

顺便再提一下,如果你strip的是.o文件,那一切都完 ...

最后一句话有问题吧。
strip *.o以后,不能再cc *.o ? 是这个意思么?

论坛徽章:
0
6 [报告]
发表于 2007-09-19 17:11 |只看该作者
原帖由 ivhb 于 2007-9-19 16:55 发表

最后一句话有问题吧。
strip *.o以后,不能再cc *.o ? 是这个意思么?



如果不strip, 所有的函数,变量都都可以通过符号名访问到. 而strip之后, 符号表被删除了,只能通过地址访问.
而在连接的时候,是通过符号名查找的.所以连接stripped的库/目标文件会失败.

论坛徽章:
0
7 [报告]
发表于 2007-09-19 17:31 |只看该作者
原帖由 web_surf 于 2007-9-19 17:11 发表



如果不strip, 所有的函数,变量都都可以通过符号名访问到. 而strip之后, 符号表被删除了,只能通过地址访问.
而在连接的时候,是通过符号名查找的.所以连接stripped的库/目标文件会失败.

不同意
对于.so库,strip过后仍然可以被链接。因为用于链接的.dynsym节仍在。
对于.o文件,strip过后确实不能在连接编译成目标文件。因为.o文件不是目标文件,和.so文件不同,它并没有.dynsym节用于导出符号给外部程序。所以我认为编译器用于链接成目标文件的符号表就是我们objdump出来看到的那张,即:
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000052  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000088  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000088  2**2
                  ALLOC   
  3 .rodata       00000007  00000000  00000000  00000088  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .note.GNU-stack 00000000  00000000  00000000  0000008f  2**0
                  CONTENTS, READONLY
  5 .comment      0000002e  00000000  00000000  0000008f  2**0
                  CONTENTS, READONLY
SYMBOL TABLE:
00000000 l    df *ABS*  00000000 t.c
00000000 l    d  .text  00000000
00000000 l    d  .data  00000000
00000000 l    d  .bss   00000000
00000000 l    d  .rodata    00000000
00000000 l    d  .note.GNU-stack    00000000
00000000 l    d  .comment   00000000
00000000 g     F .text  00000018 ppp
00000000         *UND*  00000000 printf
00000018 g     F .text  0000003a main

而strip .o文件,去掉的也正是这张表。所以strip后的.o文件不能再链接成目标文件。


(关于.o文件是我自己的猜想,我个人没找到证据证明,如果有了解的朋友请指正)

论坛徽章:
0
8 [报告]
发表于 2007-09-19 17:36 |只看该作者
原帖由 zx_wing 于 2007-9-19 17:31 发表

不同意
对于.so库,strip过后仍然可以被链接。因为用于链接的.dynsym节仍在。
对于.o文件,strip过后确实不能在连接编译成目标文件。因为.o文件不是目标文件,和.so文件不同,它并没有.dynsym节用于导出符号 ...


试了一下, so的符号表确实还存在, 但是.a和.o的已经被删除掉了(strip 之后用 objdump -d看过)

论坛徽章:
0
9 [报告]
发表于 2007-09-19 17:57 |只看该作者
原帖由 web_surf 于 2007-9-19 17:36 发表


试了一下, so的符号表确实还存在, 但是.a和.o的已经被删除掉了(strip 之后用 objdump -d看过)


对于这个问题,我有一些猜想。
我们知道objdump或nm之类的命令可以把符号表转换成可读的文本格式,但在转换的时候总需要一张表给出函数名和地址的对应关系吧(这里暂时定为符号表A)。编译时用于链接生成目标文件的那张符号表很自然的可以用作符号表A,只要把其中的static符号去掉就可以了。
对于.so文件,我认为对于它来说符号表A仍然存在,但由于它需要被外部程序动态链接,加载的时候需要把符号表加载到内存中去,所以又另外多出了一个.dynsym节(其内容和符号表A一样),它和.text节、.data节、.rodata节一样是要被load到内存中去的。而符号表A则只存在于文件中,不会被加载入内存。
strip去掉的就是符号表A。它的作用,对于.o文件用于链接生成目标文件,对于.a文件功能类似。对于.so文件,符号表A的功能仅仅是在nm或objdump的时候转换成可读的文本,除此之外别无它用。

以上是我个人的一点看法。

论坛徽章:
0
10 [报告]
发表于 2007-09-19 19:36 |只看该作者
原帖由 web_surf 于 2007-9-19 17:11 发表



如果不strip, 所有的函数,变量都都可以通过符号名访问到. 而strip之后, 符号表被删除了,只能通过地址访问.
而在连接的时候,是通过符号名查找的.所以连接stripped的库/目标文件会失败.

我不知道是不是就是这个意思

Script started on Wed Sep 19 19:30:19 2007
/export/home/ivhb/tmp/o>ls -l
total 4
-rw-r--r--   1 ivhb     other         92 Sep 19 16:53 a.c
-rw-r--r--   1 ivhb     other         11 Sep 19 16:53 b.c
-rw-r--r--   1 ivhb     other          0 Sep 19 19:30 typescript
/export/home/ivhb/tmp/o>cat a.c
#include <stdio.h>


extern int x;

int
main(void)
{
  printf("x %d\n", x);
  return (0);
}
/export/home/ivhb/tmp/o>cat b.c
int x = 9;
/export/home/ivhb/tmp/o>cc -c a.c b.c
a.c:
b.c:
/export/home/ivhb/tmp/o>ls -l *.o
-rw-r--r--   1 ivhb     other       1844 Sep 19 19:30 a.o
-rw-r--r--   1 ivhb     other       1284 Sep 19 19:30 b.o
/export/home/ivhb/tmp/o>strip *.o
/export/home/ivhb/tmp/o>ls -l *.o
-rw-r--r--   1 ivhb     other       1416 Sep 19 19:30 a.o
-rw-r--r--   1 ivhb     other        856 Sep 19 19:30 b.o
/export/home/ivhb/tmp/o>ar rv libx.a b.o
a - b.o
ar: creating libx.a
ar: writing libx.a
/export/home/ivhb/tmp/o>cc -o a.out a.o -L. -lx
/export/home/ivhb/tmp/o>ls -l a.out
-rwxr-xr-x   1 ivhb     other       5464 Sep 19 19:31 a.out
/export/home/ivhb/tmp/o>./a.out
x 9
/export/home/ivhb/tmp/o>
script done on Wed Sep 19 19:32:22 2007
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP