Loose-Info.com
Last Update 2021/01/21
TOP - 各種テスト - gcc - -fsso-struct= オプション

-fsso-struct=エンディアン
構造体と共用体のメンバのデフォルトのバイトオーダをエンディアンに設定

テスト概要

その1
-fsso-struct= オプションを使用せずにコンパイルを実行

その2
-fsso-struct=native を使用してコンパイルを実行

その3
-fsso-struct=big-endian を使用してコンパイルを実行

その4
-fsso-struct=little-endian を使用してコンパイルを実行

実行環境

GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・出力例中の赤字のコメントは必要に応じて、改行した上で挿入しています。

使用ファイル

各例共通

main.c
/* -fsso-struct= オプション動作確認用ソースファイル */ #include <stdio.h> union TestUni { int n; char c[4]; }; int main(void) { int n; union TestUni u0; n = 0x01234567; u0.n = 0x01234567; printf("int n = %x\n", n); printf("int u0.n = %x\n", u0.n); printf("char u0.c[4] = %02x %02x %02x %02x\n", u0.c[0], u0.c[1], u0.c[2], u0.c[3]); return 0; }

その1

-fsso-struct= オプションを使用せずにコンパイルを実行

コンパイル実行
$ gcc -v -Wall main.c Using built-in specs. /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... GNU C17 (GCC) version 8.2.0 (x86_64-pc-linux-gnu) compiled by GNU C version 8.2.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version none as -v --64 -o /tmp/ccSlwDRx.o /tmp/cckbXw5A.s /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... COLLECT_GCC_OPTIONS='-v' '-g' '-Wall' '-mtune=generic' '-march=x86-64' $ ./a.out int n = 1234567 int u0.n = 1234567 char u0.c[4] = 67 45 23 01 <--- デフォルトはターゲットのネイティブエンディアン(この例ではリトルエンディアン) $ objdump -S -d a.out <--- objdumpで実行形式ファイルを逆アセンブル a.out: file format elf64-x86-64 int main(void) { 401112: 55 push %rbp 401113: 48 89 e5 mov %rsp,%rbp 401116: 48 83 ec 10 sub $0x10,%rsp int n; union TestUni u0; n = 0x01234567; 40111a: c7 45 fc 67 45 23 01 movl $0x1234567,-0x4(%rbp) 構造体・共用体メンバ以外はオプションの影響無し u0.n = 0x01234567; 401121: c7 45 f8 67 45 23 01 movl $0x1234567,-0x8(%rbp) 共用体メンバもデフォルトのリトルエンディアン

その2

-fsso-struct=native を使用してコンパイルを実行

コンパイル実行
$ gcc -v -Wall -fsso-struct=native main.c <--- -fsso-struct=native を使用してコンパイル /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -fsso-struct=native ... GNU C17 (GCC) version 8.2.0 (x86_64-pc-linux-gnu) compiled by GNU C version 8.2.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version none as -v --64 -o /tmp/ccPtgNKO.o /tmp/ccJ7nZzZ.s /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... COLLECT_GCC_OPTIONS='-v' '-g' '-fsso-struct=native' '-Wall' '-mtune=generic' '-march=x86-64' $ ./a.out int n = 1234567 int u0.n = 1234567 char u0.c[4] = 67 45 23 01 <--- native指定時はデフォルトと同じリトルエンディアン $ objdump -S -d a.out <--- objdumpで実行形式ファイルを逆アセンブル a.out: file format elf64-x86-64 int main(void) { 401112: 55 push %rbp 401113: 48 89 e5 mov %rsp,%rbp 401116: 48 83 ec 10 sub $0x10,%rsp int n; union TestUni u0; n = 0x01234567; 40111a: c7 45 fc 67 45 23 01 movl $0x1234567,-0x4(%rbp) 構造体・共用体メンバ以外はオプションの影響無し u0.n = 0x01234567; 401121: c7 45 f8 67 45 23 01 movl $0x1234567,-0x8(%rbp) native指定の場合、共用体メンバはデフォルトと同じリトルエンディアン

その3

-fsso-struct=big-endian を使用してコンパイルを実行

コンパイル実行
$ gcc -v -Wall -fsso-struct=big-endian main.c <--- -fsso-struct=big-endian を使用してコンパイル Using built-in specs. /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -fsso-struct=big-endian ... GNU C17 (GCC) version 8.2.0 (x86_64-pc-linux-gnu) compiled by GNU C version 8.2.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version none as -v --64 -o /tmp/ccRaD6gc.o /tmp/ccnlTPmx.s /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... COLLECT_GCC_OPTIONS='-v' '-g' '-fsso-struct=big-endian' '-Wall' '-mtune=generic' '-march=x86-64' $ ./a.out int n = 1234567 int u0.n = 1234567 char u0.c[4] = 01 23 45 67 <--- big-endian指定時はビッグエンディアン $ objdump -S -d a.out <--- objdumpで実行形式ファイルを逆アセンブル a.out: file format elf64-x86-64 int main(void) { 401112: 55 push %rbp 401113: 48 89 e5 mov %rsp,%rbp 401116: 48 83 ec 10 sub $0x10,%rsp int n; union TestUni u0; n = 0x01234567; 40111a: c7 45 fc 67 45 23 01 movl $0x1234567,-0x4(%rbp) 構造体・共用体メンバ以外はオプションの影響無し u0.n = 0x01234567; 401121: c7 45 f8 01 23 45 67 movl $0x67452301,-0x8(%rbp) big-endian指定の場合、共用体メンバはビッグエンディアン

その4

-fsso-struct=little-endian を使用してコンパイルを実行

コンパイル実行
$ gcc -v -Wall -fsso-struct=little-endian main.c <--- -fsso-struct=little-endian を使用してコンパイル Using built-in specs. /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -fsso-struct=little-endian ... GNU C17 (GCC) version 8.2.0 (x86_64-pc-linux-gnu) compiled by GNU C version 8.2.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version none as -v --64 -o /tmp/ccqDEbNn.o /tmp/cctfao37.s /usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... COLLECT_GCC_OPTIONS='-v' '-g' '-fsso-struct=little-endian' '-Wall' '-mtune=generic' '-march=x86-64' $ ./a.out int n = 1234567 int u0.n = 1234567 char u0.c[4] = 67 45 23 01 <--- little-endian指定時はリトルエンディアン $ objdump -S -d a.out <--- objdumpで実行形式ファイルを逆アセンブル a.out: file format elf64-x86-64 int main(void) { 401112: 55 push %rbp 401113: 48 89 e5 mov %rsp,%rbp 401116: 48 83 ec 10 sub $0x10,%rsp int n; union TestUni u0; n = 0x01234567; 40111a: c7 45 fc 67 45 23 01 movl $0x1234567,-0x4(%rbp) 構造体・共用体メンバ以外はオプションの影響無し u0.n = 0x01234567; 401121: c7 45 f8 67 45 23 01 movl $0x1234567,-0x8(%rbp) little-endian指定の場合、共用体メンバはリトルエンディアン