Linux下配置Jlink

注意根据经验 ,下载最新的官方beta版本的JLINK_V420H.tag.gz 将解决tips 2上的问题 ,解决方法参考 TIPS 1,使用软连接 ln -s /lib/libreadline.so.X libreadline.so.5 1 :从 网上下载 jlink for linux 该版本为 Jlink 在linux下的版本。最近版本是JLink_Linux_100618_tar.gzjlink-software.html2:将其放在用户目录中解压 tar -zxvf JLink_Linux_100618_tar.gz目录如下/jlink/JLinkSoftware_100618$ ls45-jlink.rules JLinkExe JLinkGDBServer libjlinkarm.so.0.0 README start3:修改文件夹名称mv JLink_Linux_100618 Jlink4:修改一些配置cd Jlinkln -s libjlinkarm.so.0.0 libjlinkarm.so.0ln -s libjlinkarm.so.0.0 libjlinkarm.so5:复制相关库到用户库中复制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 下使用它。在 .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.sorm libjlinkarm.so.0

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

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

再次启动脚本

sudo ./start

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

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

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

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

J-Link>loadbin u-boot.bin,0x40000000Loading binary file… [u-boot.bin]./start: line 6: 8689 Segmentation faultLD_LIBRARY_PATH=”.” ./JLinkExe

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

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

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

J-Link>loadbin u-boot.bin,0x40000000Loading 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,0x40000000Loading 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,%eax805946d: 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: 008059481: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp)8059488: 008059489: 89 04 24 mov %eax,(%esp)805948c: e8 5f 16 ff ff call 804aaf0 <lseek@plt>8059491: 89 c3 mov %eax,%ebx8059493: 89 04 24 mov %eax,(%esp)8059496: e8 c5 14 ff ff call 804a960 <malloc@plt>805949b: 85 c0 test %eax,%eax805949d: 89 c6 mov %eax,%esi805949f: 0f 84 60 01 00 00 je 8059605 <_ExecLoadBin+0x345>80594a5: 8b 95 e0 fc ff ff mov -0x320(%ebp),%edx80594ab: 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 发布更新吧。

你的脸是为了呈现上帝赐给人类最贵重的礼物–微笑,一定要成为你工作最大的资产。

Linux下配置Jlink

相关文章:

你感兴趣的文章:

标签云: