I'm working on an arm64 box.nm
shows that my liblib1.so file has the defined function foo_incremented
, ld
cannot find it.
~/code/pack/inlib$ nm -D --demangle --defined --extern-only liblib1.so0000000000011020 B __end__0000000000000748 T _fini0000000000000730 T foo_incremented00000000000005c0 T _init
My project simply has 5 files: lib1.h, lib1.c, a.c, a.cc and Makefile.
// lib1.cint foo_incremented(int x) { return x + 1;}
// lib1.h#ifndef LIB1_H#define LIB1_H#ifdef __cplusplus__extern "C" {#endifextern int foo_incremented(int x);#ifdef __cplusplus__}#endif#endif
// a.c#include <lib1.h>#include <stdio.h>int main(int argc, char* argv[]) { int n = foo_incremented(11); printf("foo%d\n", n); return 0;}
//a.cc#include <lib1.h>#include <iostream>int main(int argc, char* argv[]) { int n = foo_incremented(11); std::cout<<n<<"\n"; std::cout<<"foo"<<"\n"; return 0;}
# Makefile.phony: cleanlib1_source=lib1.c lib1.hclean: -rm lib1.c.235r.iraliblib1.so: $(lib1_source) cc -dynamic -o $@ $<a: a.c lib1.h cc -v -Wl,-rpath=. -L. -I. -llib1 -o $@ $<acc: a.cc lib1.h c++ -Wl,-v,-rpath=. -L. -I. -llib1 -o $@ $<
The output of make a
:
~/code/pack/inlib$ make acc -Wl,-v,-rpath=. -L. -I. -llib1 -o a a.ccollect2 version 5.4.0 20160609/usr/bin/ld -plugin /usr/lib/gcc/aarch64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/aarch64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccimfYnQ.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux-aarch64.so.1 -X -EL -maarch64linux --fix-cortex-a53-843419 -z relro -o a /usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu/crt1.o /usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu/crti.o /usr/lib/gcc/aarch64-linux-gnu/5/crtbegin.o -L. -L/usr/lib/gcc/aarch64-linux-gnu/5 -L/usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu -L/usr/lib/gcc/aarch64-linux-gnu/5/../../../../lib -L/lib/aarch64-linux-gnu -L/lib/../lib -L/usr/lib/aarch64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/aarch64-linux-gnu/5/../../.. -v -rpath=. -llib1 /tmp/cc0K5Hhf.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/aarch64-linux-gnu/5/crtend.o /usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu/crtn.oGNU ld (GNU Binutils for Ubuntu) 2.26.1/tmp/cc0K5Hhf.o: In function `main':a.c:(.text+0x14): undefined reference to `foo_incremented'collect2: error: ld returned 1 exit statusMakefile:14: recipe for target 'a' failedmake: *** [a] Error 1
The output of make acc
is pretty much the same as the previous one.
ld version: GNU ld (GNU Binutils for Ubuntu) 2.26.1, gcc version: gcc (Ubuntu/Linaro 5.4.0-6kord1~16.04.12) 5.4.0 20160609