2013-03-27 58 views
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抱怨:GCC无法找到的.o存档

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发现:

[[email protected] 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 

    [[email protected] 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会成功执行:

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/zxmd_main.o前OBJ/libcvmx.a,GCC会报告更多的错误。

为什么GCC找不到在libcvmx.acvmx-tim.o

*.o顺序将导致问题?

+0

1为的问题的详细说明 – JiuDong 2013-03-27 09:16:34

回答

0

这是库的顺序:由时间

obj/libcvmx.a obj/libzxexe.a 

链接搜索obj/libzxexe.a它已经处理obj/libcvmx.a - 它不会对没有已经在当obj/libcvmx.a是拉什么再次搜索它第一次进行处理。

更改这些库的顺序:

obj/libzxexe.a obj/libcvmx.a 
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