感谢支持
我们一直在努力

Linux下配置Jlink

注意根据经验 ,下载最新的官方beta版本的JLINK_V420H.tag.gz
将解决tips 2上的问题 ,
解决方法参考 TIPS 1,
使用软连接 
ln -s      /lib/libreadline.so.X      libreadline.so.5

 
1 :从www.segger.com 网上下载 jlink for linux
该版本为 Jlinklinux下的版本。最近版本是JLink_Linux_100618_tar.gz
http://www.segger.com/cms/jlink-software.html
2:将其放在用户目录中解压
tar -zxvf JLink_Linux_100618_tar.gz
目录如下/jlink/JLinkSoftware_100618$ ls
45-jlink.rules  JLinkExe  JLinkGDBServer  libjlinkarm.so.0.0  README  start

3:修改文件夹名称
mv JLink_Linux_100618 Jlink
4:修改一些配置
cd Jlink
ln -s libjlinkarm.so.0.0 libjlinkarm.so.0
ln -s libjlinkarm.so.0.0  libjlinkarm.so
5:复制相关库到用户库中
复制45-jlink.rules到/etc/udev/rules.d/
mv libjlinkarm.so.0.0  /usr/lib/
mv libjlinkarm.so.0    /usr/lib/
mv libjlinkarm.so      /usr/lib/
6:执行./start
如果出现
libreadline.so.5 not found,可以查看/lib/下的有可能有libreadline.so.6 ,可以做一个软链接
ln -s /lib/
libreadline.so.6 libreadline.so.5
就可以了
 7:启动Jlink for linux
输入
./JLinkExe或./start

在 archlinux 下使用 jlink
J-Link 是 SEGGER 公司为支持仿真 ARM 内核芯片推出的 JTAG 仿真器。配合 IAR EWARM、ADS、KEIL、WINARM、RealView 等集成开发环境支持所有 ARM7/ARM9 内核芯片的仿真, 通过 RDI 接口和各集成开发环境无缝连接,操作方便、连接方便、简单易学,是学习开发 ARM 最好最实用的开发工具。

前些日子,我在淘宝上淘了一块 TQ2440 开发板,顺便一起买了块山寨的 J-Link,今天研究一下如何在 Linux 下使用它。在 http://www.segger.com/ 上可以找到 J-Link Commander 在 linux 下的可执行程序。将下载的 JLink_Linux_090804.tar 解压到 /home/jianglu/arm-tools/jlink/ 目录下。按照 README 的说明,安装 libusb 库、复制 udev 规则文件 45-jlink.rules 到 /etc/udev/rules.d/ 、添加用户到 plugdev 组、重启计算机。这样 jlink 就可以使用了。


插入 J-Link 到 USB 口,使用 root 权限启动 ./start 脚本

sudo ./start

程序错误,提示 ./JLinkExe: error while loading shared libraries: ./libjlinkarm.so.0: file too short


删除 2 个无效的软连接 libjlinkarm.so 和 libjlinkarm.so.0

rm libjlinkarm.so
rm libjlinkarm.so.0

重建 libjlinkarm.so 和 libjlinkarm.so.0 连接

ln -s libjlinkarm.so.0.0 libjlinkarm.so.0
ln -s libjlinkarm.so.0.0 libjlinkarm.so

再次启动脚本

sudo ./start

出现 J-Link> 提示符,J-Link 成功启动。


输入 ? 命令可以查看帮助。帮助说明的最后两行提示该程序可以执行命令脚本。

NOTE: Specifying a filename in command line
will start J-Link Commander in script mode.

在尝试各种命令时,我发现该版本的 jlink 有一个严重的问题:在使用脚本模式或 loadbin 命令时会产生段错误。譬如在 J-Link 中执行如下指令:

J-Link>loadbin u-boot.bin,0x40000000
Loading binary file... [u-boot.bin]
./start: line 6: 8689 Segmentation fault
LD_LIBRARY_PATH=”../JLinkExe

放狗搜索一番,无功而返。没辙了,抄起 GDB 大刀,先确认错误原因再说。修改 ./start 文件为:

LD_LIBRARY_PATH=”.” <strong>gdb</strong> ./JLinkExe

再次执行,进入 GDB 调试模式,使用 r 指令运行程序,在 J-Link> 提示符下再次使用 loadbin 命令,GDB捕获到异常。

J-Link>loadbin u-boot.bin,0x40000000
Loading binary file... [u-boot.bin]

Program received signal SIGSEGV, Segmentation fault.
0xb7bf6e87 in fclose@@GLIBC_2.1 () from /lib/libc.so.6
(gdb) backtrace
#0 0xb7bf6e87 in fclose@@GLIBC_2.1 () from /lib/libc.so.6
#1 0x0805952c in _ExecLoadBin ()
#2 0x08051e47 in _ExecCommandLine ()
#3 0x080520dd in main ()

再次放狗搜索 fclose 引发的断错误,果然有很多,这种情况可能是 glibc 版本不匹配导致的,晕死。
我只好下载了 glibc 三个不同的版本 2.1、2.4、2.8 版。通过修改 ./start 脚本替换本机的 glibc 执行,结果都有各种其他问题。没办法,既然调用 fclose 出错,那让程序不调用它应该就可以了,后果嘛,只不过是泄露一个文件句柄而已。


使用 objdump 程序反汇编 JLinkExe

objdump -D JLinkExe > jlink.dasm

找到异常地址处的代码

8059527: <strong>e8 c4 11 ff ff</strong> call 804a6f0 <fclose@plt>

使用 Hex 编辑器,将 JLinkExe 中的 e8 c4 11 ff ff 替换为 NOP 指令 90 90 90 90 90
大功告成,再次运行 ./start 并尝试 loadbin 命令,段错误没有了,但是又有了新的问题:

J-Link>loadbin u-boot.bin,0x40000000
Loading binary file... [u-boot.bin]
ERROR: Could not read file.

再次查看反汇编代码:

8059465: e8 d6 0e ff ff call 804a340 <open@plt>
805946a: 83 f8 ff cmp $0xffffffff,%eax
805946d: 89 85 e0 fc ff ff mov %eax,-0x320(%ebp)
8059473: 0f 84 3a 01 00 00 je 80595b3 <_ExecLoadBin+0x2f3>
8059479: c7 44 24 08 02 00 00 movl $0x2,0x8(%esp)
8059480: 00
8059481: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp)
8059488: 00
8059489: 89 04 24 mov %eax,(%esp)
805948c: e8 5f 16 ff ff call 804aaf0 <lseek@plt>
8059491: 89 c3 mov %eax,%ebx
8059493: 89 04 24 mov %eax,(%esp)
8059496: e8 c5 14 ff ff call 804a960 <malloc@plt>
805949b: 85 c0 test %eax,%eax
805949d: 89 c6 mov %eax,%esi
805949f: 0f 84 60 01 00 00 je 8059605 <_ExecLoadBin+0x345>
80594a5: 8b 95 e0 fc ff ff mov -0x320(%ebp),%edx
80594ab: 89 5c 24 08 mov %ebx,0x8(%esp)
80594af: 89 44 24 04 mov %eax,0x4(%esp)
80594b3: 89 14 24 mov %edx,(%esp)
80594b6: e8 f5 10 ff ff call 804a5b0 <read@plt>
80594bb: 39 d8 cmp %ebx,%eax

程序中先用 open 打开,在 lseek 到文件尾获取文件大小,但是在调用 read 之前竟然没有重新使用 lseek 将文件指针重新移动到文件头!所以 read 返回值永远是 0,表示读取到文件尾。这下没办法了,只能在其他地方写上正确的代码,再用 jmp 指令替换原先的 lseek 调用,来跑我们正确的代码。太麻烦了,先不搞了,提交Bug,等 J-Link 发布更新吧。

赞(0) 打赏
转载请注明出处:服务器评测 » Linux下配置Jlink
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏