在x86电脑上使用交叉编译编译移植的EdgeX core-data和export-distribution代码,编译时CGO_ENABLED=1使能。

CGO_ENABLED=1 GOOS=linux GOARCH=arm CC=arm-linux-gnueabi-gcc go build

编译出的可执行文件放到树莓派的docker容器里,容器为ubuntu:16.04,安装了core-data运行依赖的zeromq,各项配置文件都配置ok,执行core-data时报错“no such file or directory”。

查阅资料,排除位数问题,可执行文件和树莓派容器都是32位的。

$ file ./core-data

./core-data: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 3.2.0, BuildID[sha1]=c8447f05190bd4d9f5f83c214c9b0ece2e11a70d, not stripped

最终怀疑可能是动态链接库没找到。

首先查看可执行文件的依赖,使用命令

$ readelf -l ./core-data

显示结果

///结果

Elf 文件类型为 EXEC (可执行文件)
入口点 0x125c8
共有 10 个程序头,开始于偏移量 52

程序头:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0xf43254 0x00f53254 0x00f53254 0x00008 0x00008 R   0x4
  PHDR           0x000034 0x00010034 0x00010034 0x00140 0x00140 R E 0x4
  INTERP         0x000174 0x00010174 0x00010174 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.3]
  LOAD           0x000000 0x00010000 0x00010000 0xf43260 0xf43260 R E 0x10000
  LOAD           0xf43ef4 0x00f63ef4 0x00f63ef4 0x3d6ad 0x547d4 RW  0x10000
  DYNAMIC        0xf43f00 0x00f63f00 0x00f63f00 0x00100 0x00100 RW  0x4
  NOTE           0x000188 0x00010188 0x00010188 0x000a8 0x000a8 R   0x4
  TLS            0xf43ef4 0x00f63ef4 0x00f63ef4 0x00000 0x00008 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
  GNU_RELRO      0xf43ef4 0x00f63ef4 0x00f63ef4 0x0010c 0x0010c R   0x1

 Section to Segment mapping:
  段节...
   00     .ARM.exidx
   01     
   02     .interp
   03     .interp .note.ABI-tag .note.go.buildid .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .typelink .itablink .gopclntab .ARM.exidx .eh_frame
   04     .init_array .fini_array .jcr .dynamic .got .data .noptrdata .bss .noptrbss
   05     .dynamic
   06     .note.ABI-tag .note.go.buildid .note.gnu.build-id
   07     .tbss
   08     
   09     .init_array .fini_array .jcr .dynamic

///结果

能看到core-data依赖/lib/ld-linux.so.3,查看容器里/lib目录,并没有ld-linux.so.3文件,但是/lib/arm-linux-gnueabihf/目录下有ld-linux.so.3文件,但是这个目录里面的动态链接库是不会被搜索到的。查看/lib/arm-linux-gnueabihf/里文件的软链接

$ ls -ll

发现最终链接到ld-2.23.so这个链接库。

在/lib目录下建立一个链接到ld-2.23.so的ld-linux.so.3软链接

$ ln -s /lib/arm-linux-gnueabihf/ld-2.23.so /lib/ld-linux.so.3

此时core-data和export-distribution就能找到动态链接库,启动core-data成功运行