Last Update 2022/11/28
ファイル名の拡張子が「.S (sx)」であるときのコンパイラの動作
テスト概要
-Sオプションでアセンブラファイルを生成し、プリプロセッサ命令を追加して拡張子を「.S」として保存
拡張子が「.S」であるファイルのコンパイルを実行
拡張子が「.S」であるファイルのコンパイルを実行
PASS
コンパイル終了・実行ファイル生成
「その1」で作成した拡張子が「.S」であるファイルを、拡張子を「.s」としてコンパイルを実行
FAIL
プリプロセッサによる置換が実行されないためエラー発生
実行環境
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
使用ファイル
sample.c
/* 拡張子「.S (.sx)」の場合の動作確認用ソースファイル */
#include <stdio.h>
int main(void)
{
printf("拡張子「.S (.sx)」の場合の動作確認用ソースファイル\n");
return 0;
}
プリプロセスが必要な拡張子が「.S」であるファイルのコンパイル
テスト用アセンブラファイルの生成
$ ls -l
total 4
-rw-r--r-- 1 ****** ******** 224 *** ** **:** sample.c
$ gcc -S sample.c <--- -Sオプションでアセンブル直前で停止
$ ls -l
total 8
-rw-r--r-- 1 ****** ******** 224 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 687 *** ** **:** sample.s <--- アセンブラファイル
$
sample.s(生成されたアセンブラファイル)
.file "sample.c"
.text
.section .rodata
.align 8
.LC0:
.string "\346\213\241\345\274\265\345\255\220\343\200\214.S (.sx)\343\200\215\343\201..."
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 8.2.0"
.section .note.GNU-stack,"",@progbits
sample.sの以下の箇所を変更して、sample.Sとして保存
(1) 1行目として追加
#define TESTSTR "\346\213\241\345\274\265\345\255\220\343\200\214.S (.sx)\343\200\215"
(2) 6行目を変更
.string TESTSTR
拡張子が「.S」であるファイルのコンパイル
$ ls -l
total 12
-rw-r--r-- 1 ****** ******** 224 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 687 *** ** **:** sample.s
-rw-r--r-- 1 ****** ******** 519 *** ** **:** sample.S
$ gcc sample.S <--- プリプロセッサ命令を含むコードでもエラー無しで終了
$ ls -l
total 32
-rwxr-xr-x 1 ****** ******** 18328 *** ** **:** a.out <--- アセンブラファイルから実行ファイルを生成
-rw-r--r-- 1 ****** ******** 224 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 687 *** ** **:** sample.s
-rw-r--r-- 1 ****** ******** 519 *** ** **:** sample.S
$ ./a.out
拡張子「.S (.sx)」 <--- プリプロセッサで定義した文字列を出力
$
プリプロセスが必要なファイルの拡張子が「.s」であった場合の挙動
上記の「その1」実行後の状態から、
$ cp -v sample.S sample2.s <--- プリプロセスが必要なアセンブラファイルを拡張子「.s」でコピー
'sample.S' -> 'sample2.s'
$ gcc sample2.s
sample2.s: Assembler messages:
sample2.s:7: Error: junk at end of line, first unrecognized character is `T'
拡張子が「.s」の場合は、プリプロセッサによる置換が実行されないためにエラー発生
$