

**質問**  
ラズパイ4(Buster)でC++のコードを`g++
-march=armv7-a+fp`でビルドすると、filesystemを使った後でメモリ違反し落ちるようになりました。この原因と解決法を知りたいです。  
今まではデフォルトで`-march=armv6+fp`が指定されていたようです。

* * *

**背景**  
ラズパイ用のソフトをC++で開発しています。  
規模が大きくなったのでクロスコンパイルや分散ビルドを使えるように環境を作りました。  
それぞれでビルドした成果物は実機上で動く状態です。  
現状コンパイルオプションでそれぞれ違うアーキテクチャを指定しないと動作しない状態で、それを統一したいと考えています。

-march= | 通常・分散ビルド | クロスコンパイル  
---|---|---  
`armv6+fp` | 動作する | コンパイルできない  
`armv7+fp` | ビルドできるが実行すると落ちる | 動作する  
  
統一したい理由は  
・正式なバイナリは分散ビルドを、ローカルの作業でクロスコンパイルを使用したい  
・複数あるライブラリや実行ファイルの一部分をクロスコンパイルしても動くようにしたい  
クロスコンパイルに統一してしまえばいいのですが、細かい動作確認ができておらず不安です

* * *

**環境**  
本体：ラズパイ4  
OS: raspios buster armhf  
GCC: gcc (Raspbian 8.3.0-6+rpi1) 8.3.0

仮想マシン  
OS : rpd x86 buster  
GCC: arm-linux-gnueabihf-gcc (Debian 8.3.0-2) 8.3.0  
・Windows(x64)マシン上にVirtualBoxでraspios buster(x86-64)の仮想マシンを作成  
・aptでcrossbuild_essential-armhf(12.6)をインストール(gcc8.3)  
・distccで分散ビルド、又はクロスコンパイル

* * *

**調べたこと**  
落ちる箇所を調べたところ、filesystemを使用した後にメモリ違反で落ちています。  
filesystemは`libstdc++fs.a`を静的リンクしており、実機とクロスで違うファイルが取り込まれています。  
試しにクロスコンパイルで使用される仮想マシン上の`libstdc++fs.a`を実機上にコピーしてビルドすると、落ちないようになりました。  
よって恐らく実機上の`libstdc++fs.a`はarmv6専用になっており、クロスコンパイルではarmv7専用になっているのではないかと考えています。しかし動的リンクした他のlibc等は動いており、このファイルだけというのもおかしい気がします。


CC BY-SA 4.0
2023-03-15T10:30:54.747
94192
2023-03-17T04:42:49.627
2023-03-15T11:28:59.520
43025
57530
question
c++ raspberry-pi gcc
ラズパイ4(Buster)でg++ -march=armv7-aでビルドするとfilesystem?で落ちる


落ちる原因の詳細を調べたいなら話は別だけれど  
コンパイルしターゲットで動かすだけなら, あまり詳細なオプション付けないほうがよいかもしれません  
(動作の違いで齟齬が出るよりも)

以下のパッケージで `x86_64` 環境での開発・実行を確認しています  
(落ちる問題がこれで解決するかどうかは不明)

  * `gcc-arm-linux-gnueabihf`
  * `qemu-user`

[code]

    $ arm-linux-gnueabihf-gcc testprog.c -static -o testprog
    $ file testprog
    testprog: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, BuildID[sha1]=da4bf261b887c6b54de4cfdb8bac483027593edd, for GNU/Linux 3.2.0, not stripped
    $ qemu-arm testprog
    
[/code]

※ 実機でも確認済み  
手元の Raspberry Pi 4 は 64bit環境なので, static linkで行い・転送し動作確認した

g++ を利用するなら `g++-arm-linux-gnueabihf` パッケージ使用することになるでしょう


CC BY-SA 4.0
2023-03-17T04:42:49.627
94218
2023-03-17T04:42:49.627
43025
94192
answer