爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1389|回复: 12
收起左侧

[其它] linux系统下ELF编译探讨

[复制链接]
发表于 2007-10-30 20:14:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
http://www.uclinux.org/pub/uClin ... f-tools-20030314.sh

网上查了一些资料。。。

ELF是一种规范化的文件格式,不但在windows可以用IAR编译适用于西机的ELF,其他操作系统,其他软件,在使用相同的开发库文件的时候,一样可以编译出适用于西机使用的ELF。。。
在linux下用readelf命令也可以清楚的观察到elf结构,我试了一下siehelpman.elf对照源码,很清晰。。。

目前我我看到的,似乎可以用的应该就是这条工具链arm-elf-gcc
http://www.uclinux.org/pub/uClin ... f-tools-20030314.sh,这个应该就是我们需要的,具体我也不大懂,linux接触没多久。。。

这里有一个文档,里面有一些相关的内容,而我们在IAR下编译所使用的一些汇编语法也不能用了,如public,dcd,dcb这些都不能用了。

文档:
http://sieelf.googlecode.com/files/GNU之映象机理.pdf
——————————————
我知道的就是这些了。。。

                               
登录/注册后可看大图
,总感觉linux下开发ELF更有前途,哈哈,请高手出马。。。
发表于 2007-10-30 22:11:57 | 显示全部楼层
嗯。linux下貌似是要比iar方便的,但是编译器不确定。一般在linux下做嵌入式都有个仿真器或者telnet环境,但是sie上没有。。郁闷坏我了。。
回复 支持 反对

使用道具 举报

发表于 2007-10-30 22:22:14 | 显示全部楼层
倒。。回复后才发现是阿冰老大的沙发。。呵呵。。爽呆。。
之前我是用的motorola的e680i,顺便做e680i程序开发。。所以对linux环境应该还算比较熟悉。。(可以在百度搜索下我的ID呢。)

因为用了N年的战友E680I的触屏坏了,所以新来到了西门子的门下。288入手一台西门子M65

感觉不错。看到了熟悉的ELF文件,很很很很很很很熟悉。。
在LINUX下边,一般的可执行程序也是ELF格式的。

所以。貌似很有前途的说,不过毕竟M65上不是个完整的开放式系统,需要借助做好的API和BIG LIB才能艰难的进行程序开发。

LINUX里边编译的程序可以编译成不依赖库文件,即可以独立执行的程序。

嘿嘿。。。。
回复 支持 反对

使用道具 举报

发表于 2007-10-31 08:19:16 | 显示全部楼层
我也下了个Ubuntu,打算用下看看。很久以前稍微看过红帽的linux,感觉是超不好用,不知道这个怎么样。

不过硬盘都装满了,暂时找不到空间安装了。。

这些是ARM的汇编语法,linux本身的可执行elf用的是x86的汇编语法,指令集都不一样的,不过是形同质不同。只要支持arm的编译器,这些汇编语法就有用。

不过要先找到在linux下支持arm处理器的编译器。除了编译器特定的语法,相信源程序是不用大改的。这么多年了,不知道老外有没有在gcc中加入对arm指令集的支持的办法。也不知道iar有没有开发limux下的编译器。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-31 10:23:48 | 显示全部楼层
工具用arm-elf-gcc应该是没有问题的,arm-elf-gcc对arm指令的支持也应该是没有问题的

只是那些编译器特定的语法声明之类的东西是不能用了,因此我们需要一些关于gcc中作汇编和c/c++编程的资料和经验,关键是作汇编部分的资料,和IAR的差异很大,

昨天尝试了一下,源程序基本没有问题,一些地方有警告,稍微修改就可以。。。

似乎GCC编译是会检查所有用到的文件中的内容,而IAR会忽略没有被程序调用的内容,下面是siehelpman的main.c,简单的检查了一下。。。
  1. bingk@bingk-desktop:/windows_e/svn/SieELF/SieHelpMan$ arm-elf-gcc m.c
  2. In file included from png.h:378,
  3.                  from swilib.h:19,
  4.                  from m.c:1:
  5. pngconf.h:288: Invalid token in expression
  6. pngconf.h:523: Invalid token in expression
  7. pngconf.h:534: Invalid token in expression
  8. pngconf.h:596: Invalid token in expression
  9. pngconf.h:622: Invalid token in expression
  10. pngconf.h:660: Invalid token in expression
  11. pngconf.h:667: Invalid token in expression
  12. pngconf.h:692: Invalid token in expression
  13. pngconf.h:729: Invalid token in expression
  14. pngconf.h:733: Invalid token in expression
  15. pngconf.h:806: Invalid token in expression
  16. pngconf.h:812: Invalid token in expression
  17. pngconf.h:1296: Invalid token in expression
  18. In file included from swilib.h:19,
  19.                  from m.c:1:
  20. png.h:741: Invalid token in expression
  21. png.h:1046: Invalid token in expression
  22. png.h:1218: Invalid token in expression
  23. png.h:1310: Invalid token in expression
  24. png.h:1549: Invalid token in expression
  25. png.h:1554: Invalid token in expression
  26. png.h:1594: Invalid token in expression
  27. png.h:1639: Invalid token in expression
  28. png.h:1903: Invalid token in expression
  29. png.h:1909: Invalid token in expression
  30. png.h:1915: Invalid token in expression
  31. bingk@bingk-desktop:/windows_e/svn/SieELF/SieHelpMan$
复制代码
对func.asm
  1. bingk@bingk-desktop:/windows_e/svn/SieELF/SieHelpMan$ arm-elf-gcc f.s
  2. f.s: Assembler messages:
  3. f.s:2: Error: bad instruction `elf_begin '
  4. f.s:4: Error: bad instruction `arm '
  5. f.s:5: Error: bad instruction `kill_data '
  6. f.s:8: Error: bad instruction `seqkill '
  7. f.s:14: Error: bad instruction `a EQU b'
  8. f.s:15: Error: bad instruction `endm '
  9. f.s:17: Error: bad instruction `end '
  10. bingk@bingk-desktop:/windows_e/svn/SieELF/SieHelpMan$
复制代码
相当需要一位精通linux下编程的大侠指导一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-31 10:26:17 | 显示全部楼层
3楼可以提供一些编程实例否?
或者是相关经验?


                               
登录/注册后可看大图
过swilib不是绝对不能少的。。。
回复 支持 反对

使用道具 举报

发表于 2007-10-31 12:01:55 | 显示全部楼层
e680i的编程是比较容易的,写好C代码之后用GCC编译,然后链接,就可以执行了,

moto e680i是arm9的处理器,貌似西门子m65是arm4的处理器,所以指令集上应该相差不大吧。。

我的QQ是27384387,期待阿冰能够指导下,让我也入门西门子的ELF设计吧。我相信在LINUX下的设计会要很好的。。。
回复 支持 反对

使用道具 举报

发表于 2007-10-31 12:06:08 | 显示全部楼层
在linux下并不只有gcc编译器的,里面有as编译器来负责asm部分,g++和GCC负责C/C++
还有其他的编译器我暂时没有接触。呵呵。不好意思。。我以为那个asm文件应该用as编译器吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-31 12:16:01 | 显示全部楼层
M65的CPU数ARM9的

你可以加这个QQ群46284079
一些源码你可以看我们的项目,SIEELF,也可以参考置顶的索引帖

根据一楼的文档看,.s文件是可以用arm-elf-gcc编译的,我是把func.asm改名为f.s的,而且从报错上来看,并没报"BX"之类的指令错误

一楼的那个文档是相当不错的。。。其中降到的.ld连接文件,大概就是相当于我们的.xcl文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-3 20:56:37 | 显示全部楼层
这几天继续看了一下。。。

目前的几个问题。。。
1.连接文件如何写。。。
2.:::
gcc不支持__swi关键字,所以swilib中的调用手机内部函数看来要用汇编写了。。。如asm("swi 0x101")

我上面的错误是由于库文件的书写问题造成的。。。没什么关系。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-4 10:37:46 | 显示全部楼层

http://bbs.0110.cn/images/smilies/default/ee.gif


                               
登录/注册后可看大图


我试了试用wine模拟。。。效果还不错。。。IAR编译没有问题,IDA反汇编也好。。。
回复 支持 反对

使用道具 举报

发表于 2007-12-13 20:23:45 | 显示全部楼层
原帖由 jpg001 于 2007-10-31 08:19 发表
我也下了个Ubuntu,打算用下看看。。。

这些是ARM的汇编语法,linux本身的可执行elf用的是x86的汇编 ...

linux并不限于x86,linux可以工作的平台很多,包括arm、mips、x86、powerpc、power6等等,hp h4700 pda 都可以运行gentoo,moto的linux运行的是motavista linux
回复 支持 反对

使用道具 举报

发表于 2007-12-16 18:53:43 | 显示全部楼层
关键是chaintool(可能拼写错误)的获得。
65系列用的都是ARM926EJS,在linux下应该没有问题,但是,我觉得,只要可以编译代码,在什么平台下没有关系的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2025-6-8 16:45

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表