Armadilloフォーラム

リンクエラーについて

k.nishijo

2018年12月12日 11時46分

西條と申します。

掲題の件について投稿します。

以前Armadillo840でmakeしていたファイルをそのままArmadillo640 に適用して make しようとしましたが

以下のリンクエラーが発生してしまいます。

arm-linux-gnueabihf-gcc multi_process.o hot.o serial.o ram.o time.o switch.o -lusb-1.0 -lpthread -o test

/usr/lib/gcc-cross/arm-linux-gnueabihf/6/../../../../arm-linux-gnueabihf/bin/ld: -lusb-1.0 が見つかりません
collect2: error: ld returned 1 exit status

原因がわかる方がいらしたらご教示ください。

※ちなみにlibusbは apt-get install libusb-1.0-0-dev にてインストール済です。

以上よろしくお願いします。

コメント

中村です。

> /usr/lib/gcc-cross/arm-linux-gnueabihf/6/../../../../arm-linux-gnueabihf/bin/ld: -lusb-1.0 が見つかりません
> collect2: error: ld returned 1 exit status
...
> ※ちなみにlibusbは apt-get install libusb-1.0-0-dev にてインストール済です。

libusb-1.0-0-armhf-crossとlibusb-1.0-0-dev-armhf-crossを
apt-getでインストールすればいいのではないかと思います。

--
なかむら

中村様

返信ありがとうございます。

ご指示の通りにやってみましたが、下記エラーメッセージにてうまくいかないようです。

atmark@atde7:~$ sudo apt-get install libusb-1.0-0-armhf-cross
[sudo] atmark のパスワード:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ libusb-1.0-0-armhf-cross が見つかりません
E: 'libusb-1.0-0-armhf-cross' に一致するパッケージは見つかりませんでした
E: 正規表現 'libusb-1.0-0-armhf-cross' ではパッケージは見つかりませんでした

atmark@atde7:~$ sudo apt-get install libusb-1.0-0-dev-armhf-cross
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ libusb-1.0-0-dev-armhf-cross が見つかりません
E: 'libusb-1.0-0-dev-armhf-cross' に一致するパッケージは見つかりませんでした
E: 正規表現 'libusb-1.0-0-dev-armhf-cross' ではパッケージは見つかりませんでした
atmark@atde7:~$

> 中村です。
>
> > /usr/lib/gcc-cross/arm-linux-gnueabihf/6/../../../../arm-linux-gnueabihf/bin/ld: -lusb-1.0 が見つかりません
> > collect2: error: ld returned 1 exit status
> ...
> > ※ちなみにlibusbは apt-get install libusb-1.0-0-dev にてインストール済です。
>
> libusb-1.0-0-armhf-crossとlibusb-1.0-0-dev-armhf-crossを
> apt-getでインストールすればいいのではないかと思います。
>
> --
> なかむら
>

横からすみません。

[ATDE]$ sudo dpkg --add-architecture armhf
[ATDE]$ sudo apt-get update
[ATDE]$ sudo apt-get install libusb-1.0-0-dev:armhf

これでどうでしょうか。

makeが通るようになりました。
ありがとうございました。

> 横からすみません。
>
>

> [ATDE]$ sudo dpkg --add-architecture armhf
> [ATDE]$ sudo apt-get update
> [ATDE]$ sudo apt-get install libusb-1.0-0-dev:armhf
> 

>
> これでどうでしょうか。
>

中村です。

古いATDE(debian)では xxx-armhf-cross だったのが
今のATDE(debian)では xxx:armhf になっていたのを忘れてました。
不確かな情報を書いてしまって、申し訳ありませんでした。

--
なかむら

西條と申します。
たびたびすいません。

コンパイラをarm-linux-gnueabi-gccにするとまた同様に
以下のようなエラーが出るのですがこの場合はどうしたらよいのでしょうか?

arm-linux-gnueabi-gcc multi_process.o hot.o serial.o ram.o time.o switch.o -lusb-1.0 -lpthread -o test
/usr/lib/gcc-cross/arm-linux-gnueabi/6/../../../../arm-linux-gnueabi/bin/ld: -lusb-1.0 が見つかりません
collect2: error: ld returned 1 exit status

> 中村です。
>
> 古いATDE(debian)では xxx-armhf-cross だったのが
> 今のATDE(debian)では xxx:armhf になっていたのを忘れてました。
> 不確かな情報を書いてしまって、申し訳ありませんでした。
>
> --
> なかむら
>

教えていただき無事makeできるようになったのですが、

ATDE5(Armadillo840)では実行ファイルが作れていたものが

ATDE7では 共有ライブラリ (application/x-sharedlib)として作成されてしまいます。

どのように修正したらよいでしょうか?

ネットからいろいろしらべて自己流で作ったmakefileがおそらく間違っているかと思いますので

添付いたします。

修正個所をご教示いただけると助かります。

ファイル ファイルの説明
Makefile.txt

-no-pieを付けてgccを実行すれば回避できます。

ただし、gnome等のデスクトップ環境で「そのままダブルクリックで実行できない」だけで、
コマンドラインからは実行できるので、-no-pieは使わない方が良いと思います。

この挙動は最近のgccで--enable-default-pieオプションがデフォルトで付く
ようになったことで、PIE(position-independent executable)という形式でビ
ルドされた結果です。

PIE形式のメリットは、linuxカーネルが実行形式ファイルの利用するメモリ空
間をランダムなアドレスに配置(ASLRという機能)してくれるので、攻撃されづ
らくなることです。

本筋ではないので、いくつか参考になりそうなリンクを貼っておきます。

http://www.intellilink.co.jp/article/column/ctf01.html
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A…

PIE形式の実行形式ファイル(elf形式)の仕様上、ダイナミックリンクライブラ
リとヘッダにET_DYNがセットされているので、gnome等からはmime typeが
application/x-sharedlibであるという扱いを受けます。

これは特別なことではなく、例えば、/binを見ても皆 application/x-sharedlibに
なっているはずです。

確認方法:

[ATDE]~$ file --mime-type  /bin/* | less

gnomeでクリックで起動させることが目的であれば MyApp.desktop のようなエ
ントリを作ってファイル本体とクリックで起動するメニューを分ける方法があ
るようです。
https://developer.gnome.org/integration-guide/stable/desktop-files.html

>
> ただし、gnome等のデスクトップ環境で「そのままダブルクリックで実行できない」だけで、
> コマンドラインからは実行できるので、-no-pieは使わない方が良いと思います。
>
---------------------------

コマンドラインからも実行できないのかと思っていました。

たしかに、ATDE7のコマンドラインからは実行できました。

>
> ただし、gnome等のデスクトップ環境で「そのままダブルクリックで実行できない」だけで、
> コマンドラインからは実行できるので、-no-pieは使わない方が良いと思います。
>

> -no-pieを付けてgccを実行すれば回避できます。
>
> ただし、gnome等のデスクトップ環境で「そのままダブルクリックで実行できない」だけで、
> コマンドラインからは実行できるので、-no-pieは使わない方が良いと思います。
>
> この挙動は最近のgccで--enable-default-pieオプションがデフォルトで付く
> ようになったことで、PIE(position-independent executable)という形式でビ
> ルドされた結果です。
>
> PIE形式のメリットは、linuxカーネルが実行形式ファイルの利用するメモリ空
> 間をランダムなアドレスに配置(ASLRという機能)してくれるので、攻撃されづ
> らくなることです。
>
> 本筋ではないので、いくつか参考になりそうなリンクを貼っておきます。
>
> http://www.intellilink.co.jp/article/column/ctf01.html
> https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A…
>
>
> PIE形式の実行形式ファイル(elf形式)の仕様上、ダイナミックリンクライブラ
> リとヘッダにET_DYNがセットされているので、gnome等からはmime typeが
> application/x-sharedlibであるという扱いを受けます。
>
> これは特別なことではなく、例えば、/binを見ても皆 application/x-sharedlibに
> なっているはずです。
>
> 確認方法:
>

> [ATDE]~$ file --mime-type  /bin/* | less
> 

>
> gnomeでクリックで起動させることが目的であれば MyApp.desktop のようなエ
> ントリを作ってファイル本体とクリックで起動するメニューを分ける方法があ
> るようです。
> https://developer.gnome.org/integration-guide/stable/desktop-files.html
>
>
>

ATDE7上では実行できたのですが、それをUSBにコピーしてArmadillo640上で実行しようと

-bash: ./実行ファイル名: No such file or directory

となってしまい実行できません。

USBにコピーしたファイルが壊れているのかと思い、

ATDE7 上から USBにコピーしたファイルを実行しようとしたら実行ができます。

何がいけないのかさっぱりわかりません。

どなたかご教示いただければ助かります。

> >
> > ただし、gnome等のデスクトップ環境で「そのままダブルクリックで実行できない」だけで、
> > コマンドラインからは実行できるので、-no-pieは使わない方が良いと思います。
> >
> ---------------------------
>
> コマンドラインからも実行できないのかと思っていました。
>
> たしかに、ATDE7のコマンドラインからは実行できました。
>
>
>
> >
> > ただし、gnome等のデスクトップ環境で「そのままダブルクリックで実行できない」だけで、
> > コマンドラインからは実行できるので、-no-pieは使わない方が良いと思います。
> >
>
>
>
>
>
>
>
> > -no-pieを付けてgccを実行すれば回避できます。
> >
> > ただし、gnome等のデスクトップ環境で「そのままダブルクリックで実行できない」だけで、
> > コマンドラインからは実行できるので、-no-pieは使わない方が良いと思います。
> >
> > この挙動は最近のgccで--enable-default-pieオプションがデフォルトで付く
> > ようになったことで、PIE(position-independent executable)という形式でビ
> > ルドされた結果です。
> >
> > PIE形式のメリットは、linuxカーネルが実行形式ファイルの利用するメモリ空
> > 間をランダムなアドレスに配置(ASLRという機能)してくれるので、攻撃されづ
> > らくなることです。
> >
> > 本筋ではないので、いくつか参考になりそうなリンクを貼っておきます。
> >
> > http://www.intellilink.co.jp/article/column/ctf01.html
> > https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A…
> >
> >
> > PIE形式の実行形式ファイル(elf形式)の仕様上、ダイナミックリンクライブラ
> > リとヘッダにET_DYNがセットされているので、gnome等からはmime typeが
> > application/x-sharedlibであるという扱いを受けます。
> >
> > これは特別なことではなく、例えば、/binを見ても皆 application/x-sharedlibに
> > なっているはずです。
> >
> > 確認方法:
> >

> > [ATDE]~$ file --mime-type  /bin/* | less
> > 

> >
> > gnomeでクリックで起動させることが目的であれば MyApp.desktop のようなエ
> > ントリを作ってファイル本体とクリックで起動するメニューを分ける方法があ
> > るようです。
> > https://developer.gnome.org/integration-guide/stable/desktop-files.html
> >
> >
> >

三原と申します。

ATDE7 上で

$ file ./実行ファイル名

を実行すると、どんな出力がでますか。

もしかして実行ファイルは x86/x64 向けバイナリではありませんか。

三原様

返信ありがとうございます。

> $ file ./実行ファイル名

を実行したところ./実行ファイル名と同じように実行ができました。

>
> もしかして実行ファイルは x86/x64 向けバイナリではありませんか。

Armadillo840の時とは違って、ATDE7上でも動作するのでおかしいなとは思ったのですが。。。

CC = arm-linux-gnueabi-gcc でmakeしているのですが、これだけでは x86/x64向けになってしまうのでしょうか?

Linux初心者なので基本的なこともよく知りません。

ご教示いただければ助かります。

西條

> 三原と申します。
>
> ATDE7 上で
>
> $ file ./実行ファイル名
>
> を実行すると、どんな出力がでますか。
>
> もしかして実行ファイルは x86/x64 向けバイナリではありませんか。

三原と申します。

> > $ file ./実行ファイル名
>
> を実行したところ./実行ファイル名と同じように実行ができました。

ちょっと待ってください。

"file" は Linux にほぼ標準で載っているコマンドです。
ファイルのデータ種別を確認できます。

例えば

$ echo hoge > hoge.txt

として作ったファイル hoge.txt に対して file コマンドを実行すると

$ file hoge.txt
hoge.txt: ASCII text
$

というように、"このファイルは ASCII text ですよ" という出力をだします。

それで、この file コマンドは、実行ファイルに「対して」実行すると、実行ファイルの対象アーキテクチャを出力します。ここで、どの CPU に対してコンパイルされたのか分かります。

$ file ./実行ファイル

が出力した文字列をコピペしていただけませんか。

三原様

失礼しました。

以下のような文字列が出力されてきました。

ファイル名: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=6edb6db041eac673391895899063b3d72921099c, not stripped

西條

> 三原と申します。
>
> > > $ file ./実行ファイル名
> >
> > を実行したところ./実行ファイル名と同じように実行ができました。
>
> ちょっと待ってください。
>
> "file" は Linux にほぼ標準で載っているコマンドです。
> ファイルのデータ種別を確認できます。
>
> 例えば
>
> $ echo hoge > hoge.txt
>
> として作ったファイル hoge.txt に対して file コマンドを実行すると
>
> $ file hoge.txt
> hoge.txt: ASCII text
> $
>
> というように、"このファイルは ASCII text ですよ" という出力をだします。
>
> それで、この file コマンドは、実行ファイルに「対して」実行すると、実行ファイルの対象アーキテクチャを出力します。ここで、どの CPU に対してコンパイルされたのか分かります。
>
> $ file ./実行ファイル
>
> が出力した文字列をコピペしていただけませんか。

三原と申します。

> 以下のような文字列が出力されてきました。
>
>
> ファイル名: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=6edb6db041eac673391895899063b3d72921099c, not stripped

ということは、きちんと ARM CPU 向けにコンパイルされています。
(文中に "ARM" の文字列があるのを見て取れると思います)
こちらが勘違いしたようです。

この実行ファイルが ATDE7 で動作するはずはないんです。

ATDE7 で動作したとのことですが、どのように確認なさいましたか。
コマンドを1行ずつ書くレベルで説明をお願いできませんか。

三原様

以下、記載します。

実行ファイルはfilmnextです。

実行結果は”mout success!!” という文字列を吐くだけのものです。

お手数をおかけいたしますがよろしくおねがします。

atmark@atde7:~/workspace$ file filmnext
filmnext: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=6edb6db041eac673391895899063b3d72921099c, not stripped

atmark@atde7:~/workspace$ ./filmnext
mount success!!

> 三原と申します。
>
> > 以下のような文字列が出力されてきました。
> >
> >
> > ファイル名: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=6edb6db041eac673391895899063b3d72921099c, not stripped
>
> ということは、きちんと ARM CPU 向けにコンパイルされています。
> (文中に "ARM" の文字列があるのを見て取れると思います)
> こちらが勘違いしたようです。
>
> この実行ファイルが ATDE7 で動作するはずはないんです。
>
> ATDE7 で動作したとのことですが、どのように確認なさいましたか。
> コマンドを1行ずつ書くレベルで説明をお願いできませんか。

三原と申します。

西條様の状況がわからなくなってしまいました。私は有用なコメントをできません。

> atmark@atde7:~/workspace$ file filmnext
> filmnext: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=6edb6db041eac673391895899063b3d72921099c, not stripped
>
> atmark@atde7:~/workspace$ ./filmnext
> mount success!!

シェルのプロンプトに出ている文字はたしかにコピペなのですよね?
その環境でARM向けバイナリが動作する理由がわかりません。

三原樣、西條様

ATDE7のわかりづらいところで申し訳ございません。

ATDE7でARMのバイナリが実行できるのは正常です。
qemu-user-staticというパッケージがインストール済みなので、
ARMのバイナリを透過的にqemuで実行できてしまいます。

今年8月のアップデートでデフォルトインストールされました。

Armadillo 製品アップデートのお知らせ (2018年8月/Armadillo-640対象 2回目)
https://armadillo.atmark-techno.com/news/20180831/software-update-a640

元々、このアップデート以前はx1-debian-builder、もしくは
at-debian-builderを実行する前に手動でインストールして
もらっていました。

----

一方で西條様がビルドしたバイナリがArmadilloで実行できない件ですが、
Armadillo-640はarmhfのユーザーランドなのですが、armelでビルドして
いないでしょうか?

arm-linux-gnueabi-gcc ではなく arm-linux-gnueabihf-gcc でビルドした
アプリケーションを使っているか確認してみてください。

arm-linux-gnueabihf-gccにて実行できるようになりましたが、以下のエラーがまだ発生してしまいます。

error while loading shared libraries: libusb-1.0.so.0: cannot open shared object file: No such file or directory

libusb はすでに入れてあるのですがなぜでしょうか?

ご教示いただけると助かります。

西條

> 三原樣、西條様
>
> ATDE7のわかりづらいところで申し訳ございません。
>
> ATDE7でARMのバイナリが実行できるのは正常です。
> qemu-user-staticというパッケージがインストール済みなので、
> ARMのバイナリを透過的にqemuで実行できてしまいます。
>
> 今年8月のアップデートでデフォルトインストールされました。
>
> Armadillo 製品アップデートのお知らせ (2018年8月/Armadillo-640対象 2回目)
> https://armadillo.atmark-techno.com/news/20180831/software-update-a640
>
> 元々、このアップデート以前はx1-debian-builder、もしくは
> at-debian-builderを実行する前に手動でインストールして
> もらっていました。
>
> ----
>
> 一方で西條様がビルドしたバイナリがArmadilloで実行できない件ですが、
> Armadillo-640はarmhfのユーザーランドなのですが、armelでビルドして
> いないでしょうか?
>
> arm-linux-gnueabi-gcc ではなく arm-linux-gnueabihf-gcc でビルドした
> アプリケーションを使っているか確認してみてください。
>

Armadilloでは次のようにインストールしてください。

[Armadillo]~# apt-get install libusb-1.0-0

ようやく動作するようになりました。
ありがとうございました。

西條

> Armadilloでは次のようにインストールしてください。
>
>

> [Armadillo]~# apt-get install libusb-1.0-0
> 

>

overlay 機能を有効化していたため、

インストールしたlibusb が、電源再投入で消えてしまいました。

https://users.atmark-techno.com/blog/1913/2501

に従ってoverlay を無効化しようと

env delete optargs

を実行しましたが、電源再起動すると 

=> env print optargs
optargs=overlay

になってしまい無効化されません。

どのようにすれば無効化されるのかご教示いただけると助かります。

西條

> ようやく動作するようになりました。
> ありがとうございました。
>
> 西條
>
> > Armadilloでは次のようにインストールしてください。
> >
> >

> > [Armadillo]~# apt-get install libusb-1.0-0
> > 

> >

これでoptargsの値が空になります。

=> setenv optargs
=> saveenv

setenvの使い方は、引数無しで実行すると表示されます。

=> setenv
setenv - set environment variables
 
Usage:
setenv [-f] name value ...
    - [forcibly] set environment variable 'name' to 'value ...'
setenv [-f] name
    - [forcibly] delete environment variable 'name'

確認取れました。
ありがとうございました。
西條

> これでoptargsの値が空になります。
>

> => setenv optargs
> => saveenv
> 

>
> setenvの使い方は、引数無しで実行すると表示されます。
>
>

> => setenv
> setenv - set environment variables
> 
> Usage:
> setenv [-f] name value ...
>     - [forcibly] set environment variable 'name' to 'value ...'
> setenv [-f] name
>     - [forcibly] delete environment variable 'name'
> 

>