goon
"2. 14楼的代码这100byte的差别并不是printf本身造成的,这是call printf的差别,而实现printf的代码远远不至100byte,因为你指定nostdlib,所以gcc没有把printf给链接进来。我在12 楼已经把问题给简化,说明了这500k不是printf。我的观点是,这500k东西包括但不限于,elf壳,初始化,代码本身。因为这些东西占不了那么多,所以最大的可能是把一些没有用到的标准库给链进来了,如果不是那会是什么?是一张**mm图?哈哈哈"<br /><br /><br />请问你咋知道这500k不是elf的格式信息呢? 上边已经解释了, elf格式不是pe格式与它们的缘由.<br />你得拿出确切的证据证明这500k不是elf格式, 而不是想当然, pe那么小, elf也这么小.<br /><br />制定nostdlib会对elf格式造成什么影响呢? 我怀疑是那500k, 而不是真正的库函数.<br /><br />printf的代码确实不止100kb, 但是还有个标准叫PIOSX, 这个标准规定了系统调用的标准API, printf是没那么小, 但PIOSX调用绝对可以这么小. 内核通过中断来接收PIOSX API, 这个可以参考IBM的文档, 标准函数的实现过程. <br /><br /><br />goon
"我的busybox是静态链接的,我的程序全是静态链接的,因为我认为在一个封闭的嵌入式系统上用动态链接一点必要都没有.正因为这样所以没往根目录上放动态库,面helloworld是动态的,所以就出问题,但是他提示not found误导我,很无语."<br /><br />首先, 出现问题要向国际友人提问, 而不是无语.<br /><br />linux出个奇怪问题很正常. 源代码都开放了, 你自己不看, 找bug提交.<br /><br />free is not free 就是这个道理. 等你彻底理解, 掌控了, 就不会发牢骚了.<br /><br />除此以外, 你可以看一下我提到的这个问题:<br /><br />为什么动态编译的elf文件比pe文件小1倍左右, LZ改如何解释呢? 是不是 微软的pe格式里藏了一幅**MM图????<br />再做个试验让LZ死心
$ cat test.c<br />main()<br />{<br />printf ("aaaa");<br />sleep(1);<br />}<br />$cat test1.c<br />main()<br />{<br />printf ("aaaa");<br />printf ("aaaa");<br />}<br />$ gcc -o test test.c -static<br />$ gcc -o test1 test1.c -static<br /><br />$ ls -al test1<br />-rwxr-xr-x 1 industry industry 565129 2009-07-01 20:53 test1<br />$ ls -al test<br />-rwxr-xr-x 1 industry industry 565746 2009-07-01 20:53 test<br /><br /><br /><br />同样是系统调用, 如果库已经static进去了, 咋差别这么大里?<br />正在外地出差,回去后再继续讨论
正在感冒。。。休息一会再讨论
出差回来,继续
1.在顶楼我向各位高手大虾求救的问题已经解决,同时我也说明了如何解决是什么原因,在这里再次谢过。后面是在讨论顶楼问题的引伸:500k代码是什么?不是elf和pe谁更优?也不是做事应以何种态度的问题?sinanjj请不要再试途来证明这些问题谁是谁非。对于这些问题如果有兴趣可以另外再讨论。同时愿你早日康复<br />2。对于pe和elf在前面我已经承认我并不了解,对于500k是什么这个问题的观点只是基于经验的推测,我确实拿不出直接的证据去证实500K里都是些什么东西?我想sinanjj斑竹(这个刚刚注意到)同样拿不出直接的证据去证实500k就是你说的elf信息,23楼的代码我并不清楚你想要说明什么问题。但是这些数据都实实在在的在那里只要分析一下就可以知道真相,所以今天特别拿出一的时间去看了一下有关elf的文档(很遗憾这并不能为我的米缸里增加点米),并readelf工具分析了一下动态链接和静态链接的文件.以直接证明500k不是elf信息,是代码和数据。<br />代码t.c如下:<br />#include <stdio.h><br />int main()<br />{<br /> int i,j;<br />for(j=0,i = 0; i < 100; i++)<br /> j+=i;<br />return 0;<br />}<br />gcc -static -o ts t.c<br />gcc -o ts t.c<br />//动态链接td的Section Headers信息<br />readelf -S td<br />There are 36 section headers, starting at offset 0xc74:<br /><br />Section Headers:<br /> Name Type Addr Off Size ES ** Lk Inf Al<br /> [ 0] NULL 00000000 000000 000000 00 0 0 0<br /> [ 1] .interp PROGBITS 08048114 000114 000013 00 A 0 0 1<br /> [ 2] .note.ABI-tag NOTE 08048128 000128 000020 00 A 0 0 4<br /> [ 3] .hash HASH 08048148 000148 000024 04 A 5 0 4<br /> [ 4] .gnu.hash GNU_HASH 0804816c 00016c 000020 04 A 5 0 4<br /> [ 5] .dynsym DYNSYM 0804818c 00018c 000040 10 A 6 1 4<br /> [ 6] .dynstr STRTAB 080481cc 0001cc 000045 00 A 0 0 1<br /> [ 7] .gnu.version VERSYM 08048212 000212 000008 02 A 5 0 2<br /> [ 8] .gnu.version_r VERNEED 0804821c 00021c 000020 00 A 6 1 4<br /> [ 9] .rel.dyn REL 0804823c 00023c 000008 08 A 5 0 4<br /> .rel.plt REL 08048244 000244 000010 08 A 5 12 4<br /> .init PROGBITS 08048254 000254 000030 00 AX 0 0 4<br /> .plt PROGBITS 08048284 000284 000030 04 AX 0 0 4<br /> <font color=#FF0000> .text PROGBITS 080482c0 0002c0 00016c 00 AX 0 0 16<br /></font> .fini PROGBITS 0804842c 00042c 00001c 00 AX 0 0 4<br /> <font color=#FF0000> .rodata PROGBITS 08048448 000448 000008 00 A 0 0 4<br /></font> .eh_frame PROGBITS 08048450 000450 000004 00 A 0 0 4<br /> .ctors PROGBITS 08049454 000454 000008 00 WA 0 0 4<br /> .dtors PROGBITS 0804945c 00045c 000008 00 WA 0 0 4<br /> .jcr PROGBITS 08049464 000464 000004 00 WA 0 0 4<br /> .dynamic DYNAMIC 08049468 000468 0000d0 08 WA 6 0 4<br /> .got PROGBITS 08049538 000538 000004 04 WA 0 0 4<br /> .got.plt PROGBITS 0804953c 00053c 000014 04 WA 0 0 4<br /><font color=#FF0000> .data PROGBITS 08049550 000550 00000c 00 WA 0 0 4<br /> .bss NOBITS 0804955c 00055c 000004 00 WA 0 0 4</font><br /> .comment PROGBITS 00000000 00055c 000126 00 0 0 1<br /> .debug_aranges PROGBITS 00000000 000688 000050 00 0 0 8<br /> .debug_pubnames PROGBITS 00000000 0006d8 000025 00 0 0 1<br /> .debug_info PROGBITS 00000000 0006fd 0001a7 00 0 0 1<br /> .debug_abbrev PROGBITS 00000000 0008a4 00006f 00 0 0 1<br /> .debug_line PROGBITS 00000000 000913 000129 00 0 0 1<br /> .debug_str PROGBITS 00000000 000a3c 0000bb 01 MS 0 0 1<br /> .debug_ranges PROGBITS 00000000 000af8 000040 00 0 0 8<br /> .shstrtab STRTAB 00000000 000b38 000139 00 0 0 1<br /><font color=#4040FF> .symtab SYMTAB 00000000 001214 000490 10 35 55 4<br /> .strtab STRTAB 00000000 0016a4 0001f2 00 0 0 1</font><br />Key to Flags:<br /> W (write), A (alloc), X (execute), M (merge), S (strings)<br /> I (info), L (link order), G (group), x (unknown)<br /> O (extra OS processing required) o (OS specific), p (processor specific)<br /><br />//静态链接ts的Section Headers信息<br />readelf -S ts<br />There are 33 section headers, starting at offset 0x78ffc:<br /><br />Section Headers:<br /> Name Type Addr Off Size ES ** Lk Inf Al<br /> [ 0] NULL 00000000 000000 000000 00 0 0 0<br /> [ 1] .note.ABI-tag NOTE 080480d4 0000d4 000020 00 A 0 0 4<br /> [ 2] .init PROGBITS 080480f4 0000f4 000030 00 AX 0 0 4<br /> <font color=#FF0000> [ 3] .text PROGBITS 08048130 000130 0588dc 00 AX 0 0 16<br /></font> [ 4] __libc_freeres_fn PROGBITS 080a0a10 058a10 000ac2 00 AX 0 0 16<br /> [ 5] .fini PROGBITS 080a14d4 0594d4 00001c 00 AX 0 0 4<br /> <font color=#FF0000>[ 6] .rodata PROGBITS 080a1500 059500 017568 00 A 0 0 32</font><br /> [ 7] __libc_subfreeres PROGBITS 080b8a68 070a68 00002c 00 A 0 0 4<br /> [ 8] __libc_atexit PROGBITS 080b8a94 070a94 000004 00 A 0 0 4<br /> [ 9] .eh_frame PROGBITS 080b8a98 070a98 0047a8 00 A 0 0 4<br /> .gcc_except_table PROGBITS 080bd240 075240 000102 00 A 0 0 1<br /> .tdata PROGBITS 080be344 075344 000010 00 WAT 0 0 4<br /> .tbss NOBITS 080be354 075354 000018 00 WAT 0 0 4<br /> .ctors PROGBITS 080be354 075354 000008 00 WA 0 0 4<br /> .dtors PROGBITS 080be35c 07535c 00000c 00 WA 0 0 4<br /> .jcr PROGBITS 080be368 075368 000004 00 WA 0 0 4<br /> .data.rel.ro PROGBITS 080be36c 07536c 00002c 00 WA 0 0 4<br /> .got PROGBITS 080be398 075398 000008 04 WA 0 0 4<br /> .got.plt PROGBITS 080be3a0 0753a0 00000c 04 WA 0 0 4<br /><font color=#FF0000> .data PROGBITS 080be3c0 0753c0 000720 00 WA 0 0 32<br /> .bss NOBITS 080beae0 075ae0 001ad8 00 WA 0 0 32</font><br /> __libc_freeres_pt NOBITS 080c05b8 075ae0 000014 00 WA 0 0 4<br /> .comment PROGBITS 00000000 075ae0 002f16 00 0 0 1<br /> .debug_aranges PROGBITS 00000000 0789f8 000050 00 0 0 8<br /> .debug_pubnames PROGBITS 00000000 078a48 000025 00 0 0 1<br /> .debug_info PROGBITS 00000000 078a6d 0001a7 00 0 0 1<br /> .debug_abbrev PROGBITS 00000000 078c14 00006f 00 0 0 1<br /> .debug_line PROGBITS 00000000 078c83 000129 00 0 0 1<br /> .debug_str PROGBITS 00000000 078dac 0000bb 01 MS 0 0 1<br /> .debug_ranges PROGBITS 00000000 078e68 000040 00 0 0 8<br /> .shstrtab STRTAB 00000000 078ea8 000152 00 0 0 1<br /><font color=#4040FF> .symtab SYMTAB 00000000 079524 007b90 10 32 905 4<br /> .strtab STRTAB 00000000 0810b4 006e33 00 0 0 1</font><br />Key to Flags:<br /> W (write), A (alloc), X (execute), M (merge), S (strings)<br /> I (info), L (link order), G (group), x (unknown)<br /> O (extra OS processing required) o (OS specific), p (processor specific)<br /><br />从中可以看出.text .rodata .data .bbs的差别,静态的代码段.text占了350K左右 .rodata占了93K左右,所以500K不是elf信息,主要是代码和数据。那么我们的用户代码只有这么几行,所以只能是glibc库,(注兰色部分二个表是什么意思我不了解,但也有比较大的差别)<br /> <br /><br />//动态链接td的program headers信息<br />readelf -l td<br /><br />Elf file type is EXEC (Executable file)<br />Entry point 0x80482c0<br />There are 7 program headers, starting at offset 52<br /><br />Program Headers:<br /> Type Offset VirtAddr PhysAddr FileSiz MemSiz ** Align<br /> PHDR 0x000034 0x08048034 0x08048034 0x000e0 0x000e0 R E 0x4<br /> INTERP 0x000114 0x08048114 0x08048114 0x00013 0x00013 R 0x1<br /> <br /><font color=#FF0000> LOAD 0x000000 0x08048000 0x08048000 0x00454 0x00454 R E 0x1000<br /> LOAD 0x000454 0x08049454 0x08049454 0x00108 0x0010c RW 0x1000</font><br /> DYNAMIC 0x000468 0x08049468 0x08049468 0x000d0 0x000d0 RW 0x4<br /> NOTE 0x000128 0x08048128 0x08048128 0x00020 0x00020 R 0x4<br /> GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4<br /><br />Section to Segment mapping:<br /> Segment Sections...<br /> 00 <br /> 01 .interp <br /> 02 .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame <br /> 03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss <br /> 04 .dynamic <br /> 05 .note.ABI-tag <br /> 06 <br /><br /> //静态链接ts的program headers信息 <br />readelf -l ts<br />Elf file type is EXEC (Executable file)<br />Entry point 0x8048130<br />There are 5 program headers, starting at offset 52<br />Program Headers:<br /> Type Offset VirtAddr PhysAddr FileSiz MemSiz ** Align<br /><font color=#FF0000> LOAD 0x000000 0x08048000 0x08048000 0x75342 0x75342 R E 0x1000<br /> LOAD 0x075344 0x080be344 0x080be344 0x0079c 0x02288 RW 0x1000</font><br /> NOTE 0x0000d4 0x080480d4 0x080480d4 0x00020 0x00020 R 0x4<br /> TLS 0x075344 0x080be344 0x080be344 0x00010 0x00028 R 0x4<br /> GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4<br /> Section to Segment mapping:<br /> Segment Sections...<br /> 00 .note.ABI-tag .init .text __libc_freeres_fn .fini .rodata __libc_subfreeres __libc_atexit .eh_frame .gcc_except_table <br /> 01 .tdata .ctors .dtors .jcr .data.rel.ro .got .got.plt .data .bss __libc_freeres_ptrs <br /> 02 .note.ABI-tag <br /> 03 .tdata .tbss <br /> 04 <br />再看看程序头的红色部分的差别,问题就一目了然了一会仔细看看
一定给你个解释。<br /><br />我解决不了直接向GNU总部反应。。。。 刚刚被解封,讨论继续。我再看看 偶然用到elf分析。。。
此帖别沉。。。我一会分析下。。。 今天我决定解决这个问题。
呵呵呵呵哈和和呵呵哈何厚铧哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈呵呵
我又回来啦。。。。。 仔细看了看,做了几个试验,也不用引用别的啥数据了,直接引用26楼数据就够了。。。。。 首先,这个数据看起来有点乱,大家看红的那几行就行了,我把红的那几行弄下来:
分析最后两行红的(其他类似):
对比这两行:
Type Offset VirtAddr PhysAddr FileSiz MemSiz ** Align
LOAD 0x000000 0x08048000 0x08048000 0x00454 0x00454 R E 0x1000
LOAD 0x000454 0x08049454 0x08049454 0x00108 0x0010c RW0x1000
LOAD 0x000000 0x08048000 0x08048000 0x75342 0x75342 R E 0x1000
LOAD 0x075344 0x080be344 0x080be344 0x0079c 0x02288 RW0x1000
把FileSiz(不需要看别的)变成我们可理解的数据: 化简成:
type FileSiz
LOAD 0x00454
LOAD 0x00108
LOAD 0x75342
LOAD 0x0079c
变换:
type FileSiz
LOAD 0.4k
LOAD 0.1k
LOAD 75k
LOAD 0.7k
好,我们看到静态多的比动态多了75k。那么再次引用 12楼的:
"我用vc6.0 release 使用动态MFC编译是16K,不用MFC或静态MFC是36K,这才叫正常!"
这个多了20k。
但是我们的程序大小多了 500k-6k=494k
这充分说明:这494k的大小并不是主要由静态库造成的。
而20k与65k的差异很可能是因为格式不同造成的。 而且:gcc动态编译的这个程序6k,比VC编译的程序16k小10K,请问这是不是该鄙视下windows和VC,把一副**MM图加载进去了? 好,等待支持windows+VC的拍砖。。。。。。 你strip了吗,这个能差10倍。 $cat test.c
int main()
{
int i,j;
for(j = 0, i = 0;i < 100; i++)
j += i;
return 0;
}
$ gcc -o test test.c -static -O2
$ strip -s test
$ gcc -o test1 test.c -static -O2
$ ls -al
-rwxr-xr-x1 industry industry503560 2009-09-01 08:32 test
-rwxr-xr-x1 industry industry565029 2009-09-01 08:32 test1
差了60多k。
strip后的程序照常使用。
不完全理解。
请前辈解释。(也没差10倍啊。。) 才子啊
页:
1
[2]