eee 发表于 2009-6-28 19:14

busybox疑难杂症 求救!!

#&nbsp;ls<br />bin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helloworld&nbsp;&nbsp;lost+found&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp<br />dev&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usr<br />etc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linuxrc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys<br />#&nbsp;helloworld<br />-/bin/sh:&nbsp;helloworld:&nbsp;not&nbsp;found<br />#&nbsp;./helloworld<br />-/bin/sh:&nbsp;./helloworld:&nbsp;not&nbsp;found<br />#<br />如上<br />busybox&nbsp;1.14.2&nbsp;静态链接,helloworld是可拟行文件,我另外下载了一个动态链接编译好的busybox,可以执行helloworld。可是我编译的这个就是死活不行,改文件名,移动目录都不行!!

goosen 发表于 2009-6-30 15:48

re

对于出现莫名其妙的问题,<br />若确定是动态链接,则基本可以确认是所使用的编译器库版本与rootfs中的库的不一致导致的<br /><br />一个良好的习惯:确保使用的编译器与rootfs中库版本一致。同时,对于busybox,建议使用静态编译(strip后,应该才9百多k)<br />这样的话,出现问题,首先可确定不是busybox的问题。

一朝成名 发表于 2009-6-28 19:21

你这个hello world是静态还是动态?

eee 发表于 2009-6-28 19:26

如果是链接出问题,那也不会报 not found吧?

sinanjj 发表于 2009-6-28 21:06

ls -al看看

eee 发表于 2009-6-29 09:24

问题已解决,多谢

二楼给了很重要的提示.<br />因为我的busybox是静态链接的所以没向,没向板子里面copy动态库,helloworld是默认编译,gcc在默认编译下是动态链接标准库的,我将gcc的动态标准库copy到板子上就正常了.<br />但是在这里不得不鄙视一下gcc和linux<br />1.找不到动态库居然只提示;&quot;not&nbsp;found&quot;,纯粹误导用户<br />2.gcc&nbsp;-static指定静态链接情况下一个简单的printf()居然编译出来50M的可执行文件!我分析了一下目标文件发现,gcc把其它没有用到的函数全给链接进来了!!这是为什么?!我用的是glibc

sinanjj 发表于 2009-6-29 09:32

.............

你用的啥系统啊???<br />.gcc&nbsp;-static指定静态链接情况下一个简单的printf()居然编译出来50M的可执行文件!

lelee007 发表于 2009-6-29 10:37

hello如果静态编译的话,应该相当的不小吧

哈哈,没有静态编译过<br /><br />待会试试看

sinanjj 发表于 2009-6-29 12:35

我静态编译过很多东西也没这么大过

$&nbsp;ldd&nbsp;test<br />&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;a&nbsp;dynamic&nbsp;executable<br />$&nbsp;ls&nbsp;-al<br />-rwxr-xr-x&nbsp;1&nbsp;industry&nbsp;industry&nbsp;574060&nbsp;2009-06-29&nbsp;12:30&nbsp;test<br />$&nbsp;<br />这个才500多KB

EEE 发表于 2009-6-29 17:30

我看错了,是500k

不过我认为500K那也是不对头

sinanjj 发表于 2009-6-29 18:34

500k正常

建议LZ学习下静态库和动态库的基本知识

cool_coder 发表于 2009-6-29 22:21

吓我一跳,原来是0.5MB呀

eee 发表于 2009-6-30 12:30

0.5M正常?

8楼有没有分析过一个就只有调printf()的代码,GCC会把那些标准库里的函数给链接进来?<br /><br />为了简化问题我写了如下一个代码,没有调任何函数。<br />int&nbsp;main()<br />{<br />&nbsp;int&nbsp;i,j;<br />&nbsp;for(j&nbsp;=&nbsp;0,&nbsp;i&nbsp;=&nbsp;0;i&nbsp;&lt&nbsp;100;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;+=&nbsp;i;<br />&nbsp;return&nbsp;0;<br />}<br />这个代码<br />gcc&nbsp;-static&nbsp;xx.c&nbsp;-o&nbsp;xx&nbsp;-O3<br />编译后有&nbsp;556743byte<br />gcc&nbsp;-static&nbsp;xx.c&nbsp;-o&nbsp;xx<br />编译后有&nbsp;556775byte<br />gcc&nbsp;-nostdlib&nbsp;xx.c&nbsp;-o&nbsp;xx<br />编译后有&nbsp;662byte,提示没有发现入口符号_start<br />那么这500K的代码在做什么?全在初始化?<br />我用vc6.0&nbsp;release&nbsp;使用动态MFC编译是16K,不用MFC或静态MFC是36K,这才叫正常!<br />我的答案是GCC的linker太傻,把没用到的标准库一股脑全link进来了!<br />ps:请8楼给在下指点一下静态库和动态库的基本知识<br /><br /><br /><br /><br />

sinanjj 发表于 2009-6-30 14:41

500kb是正常的

“8楼有没有分析过一个就只有调printf()的代码,GCC会把那些标准库里的函数给链接进来?”<br />----------------500Kb并没有把标准库里的函数链接进来。<br /><br />“那么这500K的代码在做什么?全在初始化?<br />我用vc6.0&nbsp;release&nbsp;使用动态MFC编译是16K,不用MFC或静态MFC是36K,这才叫正常!<br />我的答案是GCC的linker太傻,把没用到的标准库一股脑全link进来了!”<br />------------------要解释这个问题,&nbsp;首先要清楚<br />1,我们常用的可执行文件不是纯2进制指令组成的,而是由一定标准规定的。linux下使用了国际标准elf格式。windows下自定义标准:pe。<br />2,你没有包含stdlib并不代表你除去的就是stdlib的库。libc的库有多大呢?仔细看看大小,一般的没有X的linux上,除了内核就是它了,我看到的这个大小还是压缩后的。<br />&nbsp;<br />&nbsp;清楚了以上,我们就可以分析这个问题的原因了。<br />我认为这是由于elf格式本身的因素造成的。具体原因因为本人只看过elf格式的标准没看过pe(微软也没公开)格式的标准也不得而知。<br /><br />我们可以做一个小例子来证明下。<br />

sinanjj 发表于 2009-6-30 14:46

接上

$cat&nbsp;test1.c<br />int&nbsp;main()<br />{}<br />$cat&nbsp;test.c<br />int&nbsp;main()<br />{<br />printf(&quot;aaaa&quot;);<br />}<br />$gcc&nbsp;-o&nbsp;test1&nbsp;test1.c&nbsp;-static<br />$gcc&nbsp;-o&nbsp;test&nbsp;test.c&nbsp;-static<br /><br />然后比对一下test和test1的差距,大于100byte,这100byte应该才是printf函数。<br /><br />如果你认为printf调用占了这么大,&nbsp;你可以再做个实验,看看2个printf编译出来的程序多大。<br /><br />

sinanjj 发表于 2009-6-30 14:53

为什么要用elf?

那么我们为什么要用elf格式呢?<br /><br />(ps:不加static比比vc的看哪个大)<br /><br />因为这是标准的,比如:哪个位代表什么意思,这里该放什么字段。如何找链接库等。<br />标准的东西受到绝大部分操作系统支持,这也是为什么unix&nbsp;linux&nbsp;mac可以2进制可执行文件通用的原因。(不能执行的大部分是因为依赖的库)包括andorid,也是静态编译完了就能跑的。<br /><br />这就是标准的好处。<br /><br />为什么微软不遵守标准?这个一方面是因为历史和技术能力原因,一方面还是为了和别人不兼容,造就根深蒂固的垄断。

eee 发表于 2009-7-1 09:30

继续讨论关于链接的问题

1.我不认为这500k是elf造成的.对elf和PE我都没有去了解过,所以现在我只能推测、想当然。但是不管是elf和PE本质都是在二进制代码上加了个壳,执行程序时PE格式是由系统脱壳装载,难道elf是自装载的?如果elf也是由系统装载的,那么PE和elf在功能上没有什么大的差别.那么在功能上差别不大的两件东西在数据量上会差别那么大?至于elf和pe熟优势劣不是我所关心的,linux和windows制定不同的标准的出发点也并不见得有多少差别,另外对于一个有确定性解的技术问题也不存在技术能力问题<br />2.&nbsp;14楼的代码这100byte的差别并不是printf本身造成的,这是call&nbsp;printf的差别,而实现printf的代码远远不至100byte,因为你指定nostdlib,所以gcc没有把printf给链接进来。我在12楼已经把问题给简化,说明了这500k不是printf。我的观点是,这500k东西包括但不限于,elf壳,初始化,代码本身。因为这些东西占不了那么多,所以最大的可能是把一些没有用到的标准库给链进来了,如果不是那会是什么?是一张**mm图?哈哈哈<br /><br />to楼上<br />&nbsp;&nbsp;&nbsp;我的busybox是静态链接的,我的程序全是静态链接的,因为我认为在一个封闭的嵌入式系统上用动态链接一点必要都没有.正因为这样所以没往根目录上放动态库,面helloworld是动态的,所以就出问题,但是他提示not&nbsp;found误导我,很无语.<br /><br />&nbsp;&nbsp;<br />

一朝成名 发表于 2009-7-1 09:37

此话题置顶讨论

goosen 发表于 2009-7-1 16:43

to eee

再重复一遍发过的,<br />1)对于出现莫名其妙的问题,<br />若确定是动态链接,则基本可以确认是所使用的编译器库版本与rootfs中的库的不一致导致的<br /><br />2)一个良好的习惯:确保使用的编译器与rootfs中库版本一致。同时,对于busybox,建议使用静态编译(strip后,应该才9百多k)<br />这样的话,出现问题,首先可确定不是busybox的问题。<br /><br />不存在误导不误导的问题。可参考1)(经验,个人觉得也没必要深究),对于2),这个是需要你来确保的。<br />要知道的是,是库版本的不一致(不一致,是否会正常工作、或别的什么提示,我想,还&nbsp;与这个不一致的程度相关的)<br />

sinanjj 发表于 2009-7-1 20:14

继续给大家讲解历史

&quot;1.我不认为这500k是elf造成的.对elf和PE我都没有去了解过,所以现在我只能推测、想当然。但是不管是elf和PE本质都是在二进制代码上加了个壳,执行程序时PE格式是由系统脱壳装载,难道elf是自装载的?如果elf也是由系统装载的,那么PE和elf在功能上没有什么大的差别.那么在功能上差别不大的两件东西在数据量上会差别那么大?至于elf和pe熟优势劣不是我所关心的,linux和windows制定不同的标准的出发点也并不见得有多少差别,另外对于一个有确定性解的技术问题也不存在技术能力问题&quot;<br />----------------------------------------首先elf格式是&quot;脱壳装载&quot;的,&nbsp;脱壳器/lib/ld-linux.so.2.<br />功能上没什么区别?区别大了.大到可以改变现在软件格局的程度.<br />关于标准,&nbsp;首先我所知道的是:&nbsp;linux下的标准全是国家化的,由权威组织制定的,&nbsp;然后由开源软件实现.&nbsp;windows下的标准是微软自己制定的,&nbsp;从来不管什么ISO什么ANSI之类,&nbsp;运动员也是裁判员.<br /><br />就elf格式标准的制定,&nbsp;那是在80年代,&nbsp;那个时候还没微软里,&nbsp;全是unix机器,&nbsp;unix也是开源的啊,&nbsp;IBM弄个,&nbsp;sun弄个,&nbsp;为了统一标准,&nbsp;一个国家化组织(当时的美国标准)制定了elf格式.这个格式的先进性在于:&nbsp;只要你符合了这个格式,&nbsp;那么只要是同一硬件平台(2进制指令相同),&nbsp;无论在哪编译的,&nbsp;copy完了就能跑.<br /><br />也就是说:elf格式是与操作系统无关的.&nbsp;无论什么操作系统,&nbsp;只要符合elf标准,&nbsp;&nbsp;那么你上边能跑的软件我这边也能跑.<br /><br />大家可以看出微软如何采取elf格式的后果:&nbsp;我们的什么office什么游戏,&nbsp;全可以在*nix下跑,&nbsp;你说这个是不是改变格局,&nbsp;是不是有利于我们,&nbsp;当然不利于微软,&nbsp;于是,&nbsp;.....大家都知道的.&nbsp;pe格式.&nbsp;在elf格式改改,&nbsp;改什么?&nbsp;当然是那些平台无关的信息都给剪掉.&nbsp;好,&nbsp;我们被微软绑架了.<br /><br />那么elf和pe哪个好?&nbsp;elf是通用的,&nbsp;肯定更加复杂,&nbsp;包含的头信息更多,&nbsp;pe好实现,&nbsp;而且要垄断&nbsp;,于是微软把精简的elf改了个名pe.<br /><br />现在你该清楚为什么pe和elf如此类似.<br /><br /><br /><br />
页: [1] 2
查看完整版本: busybox疑难杂症 求救!!