Cross-compiling ARM binary fails to find symbol from external library [libncurses]
Question
I am trying to cross-compile C program on Ubuntu 13.04 (i386 platform).
I setup my cross compiler toolchain using the commands below -
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.8-arm-linux-gnueabihf g++-4.8-arm-linux-gnueabihf pkg-config-arm-linux-gnueabihf
I wrote a small program using posix thread and it compiles and produces ARM executable using the following command -
arm-linux-gnueabihf-gcc-4.8 thread.c -o thread -lpthread
./file thread command produces
thread: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x960a38d130a451ebb85903b5374894ff364e0633, not stripped
I noticed that pthread library was installed as part of toolchain installation.
/usr/arm-linux-gnueabihf/lib/libpthread.so.0
So far everything worked fine.
Now I tried to write a small program as below using ncurses library.
#include<ncurses.h>
int main()
{
initscr();
printw("Hello world\n");
refresh();
getch();
endwin();
return 0;
}
When I used the below command to compile the program, it could not find libncurses.so for ARM.
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lncurses
collect2: error: ld returned 1 exit status
I had libncurses installed for i386 and I verified that my program compiles and runs for i386 without any problem.
Considering the library is missing for ARM, I downloaded the library from - https://packages.debian.org/en/wheezy/libncurses5 [for ARM]. I extracted the debian package and copied the .so files in the same directory where libpthread.so was located.
$/usr/arm-linux-gnueabihf/lib: ls -l libncurses.so
produces
lrwxrwxrwx 1 root root 17 Mar 3 23:07 libncurses.so -> libncurses.so.5.9
now I issued the compilation command again and it produced the below output -
$./arm-linux-gnueabihf-gcc-4.8 curse.c -o curse -lncurses
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: warning: libdl.so.2, needed by /usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so, not found (try using -rpath or -rpath-link)
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: warning: libtinfo.so.5, needed by /usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so, not found (try using -rpath or -rpath-link)
/tmp/ccLCmSAV.o: In function `main':
curse.c:(.text+0x14): undefined reference to `stdscr'
curse.c:(.text+0x18): undefined reference to `stdscr'
curse.c:(.text+0x24): undefined reference to `stdscr'
curse.c:(.text+0x28): undefined reference to `stdscr'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `curscr'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_setupterm'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_set_no_padding'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_getenv_num'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `tputs'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `SP'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_locale_breaks_acs'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `baudrate'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `acs_map'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `putp'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_putp'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_get_locale'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_safe_strcpy'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `cbreak'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_screen_chain'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_doalloc'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_access'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_set_buffer'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `raw'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_keypad'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `unctrl'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_get_screensize'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `tparm'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `noraw'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `tigetflag'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `wtimeout'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_str_init'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `typeahead'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_safe_strcat'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `dlsym@GLIBC_2.4'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_str_copy'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `set_curterm'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_init_acs'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_set_tty_mode'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `COLS'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_outch'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `newscr'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `reset_prog_mode'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `killchar'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `del_curterm'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `def_prog_mode'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_flush'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `def_shell_mode'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `has_ic'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_unicode_locale'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_add_to_try'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `LINES'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `TABSIZE'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_handle_sigwinch'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `nocbreak'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_timed_wait'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_name_match'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_prescreen'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `cur_term'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `flushinp'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `keyok'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `erasechar'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `dlopen@GLIBC_2.4'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `curs_set'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_update_screensize'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `dlclose@GLIBC_2.4'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `reset_shell_mode'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_get_tty_mode'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_globals'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_screen_of'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `tigetstr'
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libncurses.so: undefined reference to `_nc_str_null'
collect2: error: ld returned 1 exit status
I could not find libdl.so, but my system has libtinfo.so.5 installed in the same location where libncurses.so is installed.
/usr/arm-linux-gnueabihf/lib$ ls -l libtinfo.so*
lrwxrwxrwx 1 root root 15 Mar 4 00:36 libtinfo.so -> libtinfo.so.5.9
lrwxrwxrwx 1 root root 15 Mar 4 00:37 libtinfo.so.5 -> libtinfo.so.5.9
-rw-r--r-- 1 root root 100976 Mar 4 00:36 libtinfo.so.5.9
So why can't it find libtinfo.so.5? And why is it failing to find the symbols from libncurses.so?
Please help.
Thanks, - Salman ~
No correct solution