0

TLDR:
Running a program on arm (cross-compiled on Ubuntu) which uses openCV generates error: error while loading shared libraries: /lib/libopencv_highgui.so.3.1: internal error

I posted here and here but I've got no luck so I'm trying here.

I cross-compiled OpenCV for arm following this guide, and built this sample program using cmake and make:

#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char** argv )
{
    if ( argc != 2 )
    {
        printf("usage: DisplayImage.out <Image_Path>\n");
        return -1;
    }

    Mat image;
    image = imread( argv[1], 1 );

    if ( !image.data )
    {
        printf("No image data \n");
        return -1;
    }
    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);

    waitKey(0);

    return 0;
}

(host: Ubuntu, target: arm)

When I copy the binary and the libs to the target and run the binary I get this error:

./DisplayImage: error while loading shared libraries: /lib/libopencv_highgui.so.3.1: internal error

This is my CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-linux-gnueabihf-gcc )
set( CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ )

edit 2: I forgot to mention the following also in CMakeLists.txt:

SET( GCC_COVERAGE_LINK_FLAGS    "-Wl,--dynamic-linker=/lib/ld-linux.so.3")
SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )

Without these 2 lines I get -sh: ./DisplayImage: not found. So I add them to tell the program where to find the linker. It works with other programs that don't use OpenCV...


This is not a duplicate of "openCV program compile error “libopencv_core.so.2.4: cannot open shared object file: No such file or directory” in ubuntu 12.04" because I'm not getting a "No such file or directory..."

Why am I getting this or how can I get more information about the error? I tried running strace on the program and I got:

open("/home/my_host_user/opencv/opencv/platforms/linux/my_build_dir/lib/vfp/libopencv_highgui.so.3.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/home/my_host_user/opencv/opencv/platforms/linux/my_build_dir/lib/vfp", 0x7e9e94f0) = -1 ENOENT (No such file or directory)

... //and more like these

So it's like something is still linked with the host machine names (see my_host_user and my_build_dir - these are directories in my host machine)

edit 1:
I also get this error with strace:

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)

edit 3:
Running ldd on the program in Ubuntu produces not a dynamic executable (I guess becaues it's not built for Ubuntu). So I tried readelf -d DisplayImage | grep NEEDED and I got:

 0x00000001 (NEEDED)                     Shared library: [libopencv_highgui.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_imgcodecs.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libopencv_core.so.3.1]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [ld-linux-armhf.so.3]

I found all of them on my target except ld-linux-armhf.so.3.

Sorry for the long post...

Community
  • 1
  • 1
Alaa M.
  • 4,961
  • 10
  • 54
  • 95

0 Answers0