質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

QEMU

QEMU(キューエミュ)は、Fabrice Bellardが中心となって開発しているオープンソースのプロセッサエミュレータ

Q&A

解決済

1回答

6034閲覧

Linux kernel を -O0 でコンパイルするとアセンブラでエラーになる

kenz_san

総合スコア33

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

QEMU

QEMU(キューエミュ)は、Fabrice Bellardが中心となって開発しているオープンソースのプロセッサエミュレータ

1グッド

1クリップ

投稿2016/07/24 05:21

編集2016/08/05 06:51

raspberry pi 向けの qemu の開発をしており、一部機能の不具合対応(ext4 でマウントエラーが発生)のため kernel を最適化なし(-O0)でコンパイルしたいのですが、コンパイルエラーが発生してしまっています。(-O1や-O2ではコンパイルできます)

解決策を探しているのですが、見つかっていません。どなたか情報を持っていないでしょうか?(「 -O0 はサポートしていないよ」とか)

../include/linux/compiler-gcc4.h:77:38: error: impossible constraint in ‘asm’ #define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) ^ ... In file included from ../include/linux/linkage.h:4:0, from ../include/linux/fs.h:5, from ../fs/ext4/ext4_jbd2.h:18, from ../fs/ext4/mballoc.c:24: In function ‘__list_add_rcu’, inlined from ‘list_add_tail_rcu’ at ../include/linux/rculist.h:102:16, inlined from ‘ext4_mb_add_n_trim’ at ../fs/ext4/mballoc.c:4301:21: ../include/linux/compiler.h:412:20: error: call to ‘__compiletime_assert_54’ declared with attribute error: Need native word sized stores/loads for atomicity. prefix ## suffix(); \ ^

他にも、以下のような note や warning が出ていますが、関連がわかっていません。

../arch/arm/include/asm/jump_label.h: In function ‘ext4_mb_init_cache’: ../include/linux/compiler-gcc4.h:77:38: warning: asm operand 0 probably doesn’t match constraints [enabled by default] #define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) ^ ../arch/arm/include/asm/jump_label.h:18:2: note: in expansion of macro ‘asm_volatile_goto’ asm_volatile_goto("1:\n\t" ^ ../include/linux/compiler-gcc4.h:77:38: warning: asm operand 0 probably doesn’t match constraints [enabled by default] #define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) ^ ../arch/arm/include/asm/jump_label.h:18:2: note: in expansion of macro ‘asm_volatile_goto’ asm_volatile_goto("1:\n\t" ^ ... ../include/linux/compiler.h:417:2: note: in expansion of macro ‘__compiletime_assert’ __compiletime_assert(condition, msg, prefix, suffix) ^ ... ../arch/arm/include/asm/barrier.h:68:2: note: in expansion of macro ‘compiletime_assert_atomic_type’ compiletime_assert_atomic_type(*p); \ ^

開発環境は以下のような感じです。

項目内容
kernel4.1.21
gcc4.8.3
hostlinux mint 17.3 64bit
コンパイルmake -j8 CFLAGS_mballoc.o="-O0"

よろしくお願いします。

nullbot👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2016/07/30 06:46

コンパイル時assert「Need native word sized stores/loads for atomicity.」が出ていますが、-O0以外ではコンパイルで来ているのでしょうか?
kenz_san

2016/08/06 03:29

本文に追記しました。 -O1 や -O2 ではコンパイルできています。
guest

回答1

0

ベストアンサー

-O0を使って、どういうことをやろうとしているのか分からないので、的外れかもしれませんが、
#pragma GCC optimize ("Ox")を使って、ファイル中の必要ところに、必要な最適化オプションを適用してしまうのはどうでしょうか?

"ext4_jbd2.h"と<trace/events/ext4.h>の箇所を -O2設定にすることで、
make CFLAGS_mballoc.o="-O0"でコンパイルは、通りました(※)。

  • 例:linux/fs/ext4/mballoc.c

c:fs/ext4/mballoc.c

1... 2#pragma GCC push_options 3#pragma GCC optimize ("O2") 4#include "ext4_jbd2.h" 5#pragma GCC pop_options 6#include "mballoc.h" 7#include <linux/log2.h> 8#include <linux/module.h> 9#include <linux/slab.h> 10#include <linux/backing-dev.h> 11#pragma GCC push_options 12#pragma GCC optimize ("O2") 13#include <trace/events/ext4.h> 14#pragma GCC pop_options 15 16...
  • 以下のような警告が出ますが、だいじょぶっぽい?
warning: #pragma GCC target is not supported for this machine [-Wpragmas] #pragma GCC pop_options

(※) 環境

  • ホスト: Ubuntu 16.04

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

  • Raspberry Pi カーネルソース (試した時点で最新 commit: db84877)

$ head -5 Makefile
VERSION = 4
PATCHLEVEL = 4
SUBLEVEL = 16
EXTRAVERSION =
NAME = Blurry Fish Butt

  • クロスコンパイラ

$ ../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) 4.8.3 20140303 (prerelease)

投稿2016/08/09 17:06

mt08

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenz_san

2016/08/09 23:41 編集

回答ありがとうございます。 GCC にそんな拡張があったことを知りませんでした。奥が深いですね。 教えていただいたコードを適用したのですが、質問したものと別のエラーが発生してしまい、まだ動作確認までたどり着いていません。 ``` ### これまでエラーのなかった CFLAGS_mballoc.o="-O1" でも同様のエラーになる $ make -j8 CFLAGS_mballoc.o="-O0" ... CC fs/ext4/mballoc.o CHK kernel/config_data.h ../fs/ext4/mballoc.c:27:9: warning: #pragma GCC target is not supported for this machine [-Wpragmas] #pragma GCC pop_options ^ ../fs/ext4/mballoc.c: In function ‘ext4_exit_mballoc’: ../fs/ext4/mballoc.c:2866:1: internal compiler error: in dwarf2out_frame_debug_adjust_cfa, at dwarf2cfi.c:1078 } ^ Please submit a full bug report, with preprocessed source if appropriate. See <https://bugs.launchpad.net/gcc-linaro> for instructions. make[4]: *** [fs/ext4/mballoc.o] Error 1 ``` mt08 さんとは kernel バージョンが異なるため、そのあたりを引き続き掘り下げていこうと思っています。 ちなみに、 `-O0` でやりたいことは、qemu を経由して GDB による kernel のデバッグを行うことです。( `-O1` 以上の最適化が入ると変数の参照などがまともにできなかったので)
mt08

2016/08/10 00:03

kenz_sanさん、 `git clone --depth=1 https://github.com/raspberrypi/linux.git -b rpi-4.1.y`で取得してみました。エラーでますね。 `#include`を全部、"-O2"にしたら、、コンパイル通るみたいですよ。 ``` #pragma GCC push_options #pragma GCC optimize ("O2") #include "ext4_jbd2.h" #include "mballoc.h" #include <linux/log2.h> #include <linux/module.h> #include <linux/slab.h> #include <trace/events/ext4.h> #pragma GCC pop_options ``` $ head -5 Makefile VERSION = 4 PATCHLEVEL = 1 SUBLEVEL = 21 EXTRAVERSION = NAME = Series 4800
kenz_san

2016/08/11 12:42

mt08 さん 確認ありがとうございます。同様にヘッダをすべて push_options / pop_options で囲ってみましたが、エラーは解消されませんでした。。 ソース、コンパイラはともに最新のコミットを利用しているため、差異はないはずなのですが。。 エラーの発生していた `ext4_exit_mballoc` と対になる `ext4_init_mballoc` を push_options / pop_options で `O1` にしたらコンパイルは通った( `O2` ではダメでした)のですが、また別のエラーが、、 ``` LD init/built-in.o fs/built-in.o: 関数 `kmalloc_large' 内: /home/tkenji/Workspace/raspi/linux-rpi-4.1.y/raspi-build/../include/linux/slab.h:361: `____ilog2_NaN' に対する定義されていない参照です /home/tkenji/Workspace/raspi/linux-rpi-4.1.y/raspi-build/../include/linux/slab.h:361: `____ilog2_NaN' に対する定義されていない参照です make[2]: *** [vmlinux] Error 1 ``` エラー自体は既知の問題のようなので(多くの情報はgccのバグとして解決済みになっているようですが、、)回避策を探ってみます。
kenz_san

2016/08/16 02:22

`____ilog2_NaN` については、最終的に削除することで対処しました。 コンパイルしたカーネルをQEMUで起動し、最適化のかかっていない状態でデバッグできるようになりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問