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はさらに多くのエラーを報告します。

なぜgccはで見つけることができませんcvmx-tim.olibcvmx.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

Paxym

于 2016-07-21T02:53:23.743 に答える