ひでみのアイデア帳

くだらないことなんだけど、忘れないために・・・

not foundってなんですの?(SDx続き)

ELFファイルのステータスを見てみましょう。

% readelf -a OpenCV_Sample03.elf
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x11484
  Start of program headers:          52 (bytes into file)
  Start of section headers:          226824 (bytes into file)
  Flags:                             0x5000400, Version5 EABI, hard-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         8
  Size of section headers:           40 (bytes)
  Number of section headers:         39
  Section header string table index: 36

特に問題ないですね。

と、いうかエラーはnot foundなのでELFファイル以前の問題か?

試しにHello Worldを作成した。

#include <stdio.h>

int main(int argc, char *args[])
{
    printf("Hello, world!\n");
    return 0;
}

コンパイルはいたって簡単に・・・

% ${CC} -o hello hello.c

そして、実行すると・・・

root@zturn:~# ./hello
Hello, world!

問題なく、実機で動作する。

そこでreadelfしてみると・・・

% readelf -a ./hello
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x102f4
  Start of program headers:          52 (bytes into file)
  Start of section headers:          7988 (bytes into file)
  Flags:                             0x5000400, Version5 EABI, hard-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         8
  Size of section headers:           40 (bytes)
  Number of section headers:         38
  Section header string table index: 35

特に問題ないですね。

なにが原因で、not foundなんでしょうか?

いいところまで来ていると思うのですが・・・

単純なコンパイル用ソースコードにprintfを追加してみました。

/*
 * OpenCV フィルタサンプル - ラプラシアン
g++ -o sobel_sample01 sobel_sample01.cpp -I/usr/local/include -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_im
gproc
 */
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>

int main( int argc, char** argv )
{
  printf("exec: OpenCV_Sample01\n");

  // Read lena-chan with Grayscale
  printf("read: lena.png\n");
  cv::Mat src = cv::imread("lena.png", 0);

  printf("exec: laplacian\n");
  cv::Mat laplacian, tmp;
  cv::Laplacian(src, tmp, CV_32F, 3);
  cv::convertScaleAbs(tmp, laplacian, 1, 0);

  // Write for laplacian not kuracian
  printf("write: lena_laplacian.png\n");
  cv::imwrite("lena_laplacian.png", laplacian);

  printf("finish: OpenCV_Sample01\n");

  return 0;
}

それとSDカードにOpenCVライブラリが入っていなかったのでSDカードのrootfsをちゃんとコピーしてみた。

そうしたら、今度は"No such file or directory"になった。

root@zturn:~# ./OpenCV_Sample01.elf
-sh: ./OpenCV_Sample01.elf: No such file or directory

printfが出る前に、弾かれているのですがどうしたことなのでしょうか?

ELFファイルを直接、確認したところSDxで生成したELFファイルはld-linuxがld-linux.so.3に向いていることが判った。

本当はld-linux-armhf.so.3に向いていて欲しいのだが、コンパイルがうまく言っていないことが判った。

試しに実機でld-linux.so.3をld-linux-armhd.so.3にリンクすると次のようにエラーが変化した。

root@zturn:~# ln -s /lib/ld-linux-armhf.so.3 /lib/ld-linux.so.3
root@zturn:~# ./OpenCV_Sample01.elf
cf_context_init()
ERROR: unable to open xlnk

なんですと!

xlnxが開けませんって?