Last Update 2021/01/21
-fsso-struct=エンディアン
構造体と共用体のメンバのデフォルトのバイトオーダをエンディアンに設定
テスト概要
-fsso-struct= オプションを使用せずにコンパイルを実行
-fsso-struct=native を使用してコンパイルを実行
-fsso-struct=big-endian を使用してコンパイルを実行
-fsso-struct=little-endian を使用してコンパイルを実行
実行環境
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
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;
}
-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)
共用体メンバもデフォルトのリトルエンディアン
︙
-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指定の場合、共用体メンバはデフォルトと同じリトルエンディアン
︙
-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指定の場合、共用体メンバはビッグエンディアン
︙
-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指定の場合、共用体メンバはリトルエンディアン
︙