1
 mipsisa64-octeon-elf-gcc obj/zxmd_main.o obj/zxmd_mproc.o obj/zxmd_init.o obj/zxmd_pcie.o  obj/libcvm-common.a obj/libcvm-pci-drv.a  obj/libcvmhfao.a obj/libocteon-hfa.a /home/jianxi/Juson/JusonFlow/sdk/OCTEON-SDK/components/hfa/lib-octeon/pp/octeon/se/libpp.a obj/libcvmx.a obj/libzxexe.a obj/libfdt.a   -mfix-cn63xxp1 -march=octeon2 -o cn63hw1.bin

gcc 抱怨:

obj/libzxexe.a(zxmx_tim.o): In function `zxmx_init_tim':
/home/jianxi/Juson/JusonFlow/libexec/zxmx_tim.c:47: undefined reference to `cvmx_tim_setup'

cvmx_tim_setup 可以在以下位置找到libcvmx.a

[jianxi@jianxi obj]$ readelf -h libcvmx.a | grep "cvmx-tim.o" -A21
File: libcvmx.a(cvmx-tim.o)
ELF Header:
  Magic:   7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, big endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           MIPS R3000
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          13424 (bytes into file)
  Flags:                             0x808d4001, noreorder, octeon2, eabi64, mips64r2
  Size of this header:               52 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           40 (bytes)
  Number of section headers:         33
  Section header string table index: 30

  [jianxi@jianxi obj]$ readelf -s cvmx-tim.o
      27: 00000000    92 FUNC    GLOBAL DEFAULT    1 cvmx_tim_start
      28: 00000000    40 OBJECT  GLOBAL DEFAULT   16 cvmx_tim
      29: 00000060    56 FUNC    GLOBAL DEFAULT    1 cvmx_tim_stop
      30: 00000098   276 FUNC    GLOBAL DEFAULT    1 cvmx_tim_shutdown
      31: 000001b0   752 FUNC    GLOBAL DEFAULT    1 cvmx_tim_setup
      32: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND cvmx_clock_get_rate
      33: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND cvmx_bootmem_alloc
      34: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND memset
      35: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND puts
      36: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND printf

当我cvmx-tim.o在命令中添加时,gcc会执行成功:</p>

mipsisa64-octeon-elf-gcc  obj/cvmx-tim.o obj/zxmd_main.o obj/zxmd_mproc.o obj/zxmd_init.o obj/zxmd_pcie.o  obj/libcvm-common.a obj/libcvm-pci-drv.a  obj/libcvmhfao.a obj/libocteon-hfa.a /home/jianxi/Juson/JusonFlow/sdk/OCTEON-SDK/components/hfa/lib-octeon/pp/octeon/se/libpp.a obj/libcvmx.a obj/libzxexe.a obj/libfdt.a -mfix-cn63xxp1 -march=octeon2 -o cn63hw1.bin

如果把 obj/libcvmx.a 放在 obj/zxmd_main.o 前面,gcc 会报更多的错误。

cvmx-tim.o为什么gcc中找不到libcvmx.a

的顺序*.o会不会造成问题?

4

2 回答 2

0

这是图书馆的顺序:

obj/libcvmx.a obj/libzxexe.a

到链接器搜索obj/libzxexe.a它已经处理的时候obj/libcvmx.a- 它不会再次搜索第一次处理时尚未拉入的任何内容obj/libcvmx.a

将这些库的顺序更改为:

obj/libzxexe.a obj/libcvmx.a
于 2013-03-27T09:10:32.390 回答
0

除了更改库的顺序外,您还可以强制 cvmx_tim_setup 在命令行中标记为“未定义”符号。如果已知该符号是必需的,那么链接器将寻找它并记住定义它的第一个库。将此标志添加到 gcc 命令:-Wl,--undefined=cvmx_tim_setup

此外,您还可以在 gcc 中试验 --start-group 和 --end-group。--start-group(要链接的二进制文件列表)--end-group。这将允许搜索的完整循环关闭。但是会消耗一些链接性能。

参考: http ://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking

派克西姆

于 2016-07-21T02:53:23.743 回答