I have a program which is dependent upon a library (called "libFoo.so" here). libFoo.so is also dependent upon a number of other libraries: libVendor.so, libFooVendor.so, and liblog.so. Whenever I try to link against just libFoo.so, ie arm-linux-gnueabi-gcc -o myprogram main.c -lFoo
, and run the program, I get "undefined symbol: main".
However, if I link in the other libraries via arm-linux-gnueabi-gcc -o myprogram main.c -lFoo -lFooVendor -lVendor -llog
everything works.
I know this isn't the "right" way to handle a library that is dependent on other libraries. I should be using rpath or rpath-link. All of the libraries for my program are in /usr/lib/. When I try to use rpath=/usr/lib or rpath-link=[path to my libraries in my cross compilation chain], it doesn't seem to affect the result. I still get "undefined symbol: main"
How can I resolve this? Should I be creating libFoo.so differently? It's made with (header includes and shared library paths removed) arm-linux-gnueabi-gcc -o libFoo.so -shared -fPIC source.c -lFooVendor -lVendor -llog
Example: libFoo.so
arm-linux-gnueabi-readelf -d out/libFoo.so Dynamic section at offset 0x7e1a8 contains 33 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0x7f738 0x00000002 (PLTRELSZ) 13400 (bytes) 0x00000017 (JMPREL) 0x3bc18 0x00000014 (PLTREL) REL 0x00000011 (REL) 0x3b420 0x00000012 (RELSZ) 2040 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffa (RELCOUNT) 27 0x00000006 (SYMTAB) 0x158 0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0x94b8 0x0000000a (STRSZ) 180325 (bytes) 0x00000001 (NEEDED) Shared library: [libFooVendor.so.0] 0x00000001 (NEEDED) Shared library: [libVendor.so.0] 0x00000001 (NEEDED) Shared library: [liblog.so.0] 0x00000001 (NEEDED) Shared library: [libstdc++.so.6] 0x00000001 (NEEDED) Shared library: [libm.so.6] 0x00000001 (NEEDED) Shared library: [libgcc_s.so.1] 0x00000001 (NEEDED) Shared library: [libc.so.6] 0x0000000c (INIT) 0x3f070 0x0000000d (FINI) 0x76504 0x00000019 (INIT_ARRAY) 0x7f334 0x0000001b (INIT_ARRAYSZ) 28 (bytes) 0x0000001a (FINI_ARRAY) 0x7f350 0x0000001c (FINI_ARRAYSZ) 4 (bytes) 0x6ffffff0 (VERSYM) 0x3a0e8 0x6ffffffc (VERDEF) 0x3b354 0x6ffffffd (VERDEFNUM) 1 0x6ffffffe (VERNEED) 0x3b370 0x6fffffff (VERNEEDNUM) 3 0x00000000 (NULL) 0x0
Example: program linked only with -lFoo
arm-linux-gnueabi-readelf -d out/myprogram Dynamic section at offset 0xc5c contains 27 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0x9d74 0x00000002 (PLTRELSZ) 128 (bytes) 0x00000017 (JMPREL) 0x855c 0x00000014 (PLTREL) REL 0x00000011 (REL) 0x8554 0x00000012 (RELSZ) 8 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x00000015 (DEBUG) 0x0 0x00000006 (SYMTAB) 0x81ac 0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0x833c 0x0000000a (STRSZ) 398 (bytes) 0x6ffffef5 (GNU_HASH) 0x84cc 0x00000001 (NEEDED) Shared library: [libFoo.so] 0x00000001 (NEEDED) Shared library: [libc.so.6] 0x0000000c (INIT) 0x85dc 0x0000000d (FINI) 0x8c14 0x00000019 (INIT_ARRAY) 0x9d64 0x0000001b (INIT_ARRAYSZ) 4 (bytes) 0x0000001a (FINI_ARRAY) 0x9d68 0x0000001c (FINI_ARRAYSZ) 4 (bytes) 0x6ffffff0 (VERSYM) 0x8500 0x6ffffffe (VERNEED) 0x8534 0x6fffffff (VERNEEDNUM) 1 0x00000000 (NULL) 0x0