[インデックス 11742] ファイルの概要
このコミットは、Go言語のランタイムがLinux/ARMシステム上で動作する際に、古いOABI (Old Application Binary Interface) システムを検出し、互換性がない場合に早期にエラーメッセージを出力して終了するように修正するものです。これにより、GoプログラムがEABI (Embedded Application Binary Interface) を必要とする環境で、OABIシステム上で誤って実行されることを防ぎ、ユーザーに適切な診断情報を提供します。
コミット
commit bb40196ebf50d461b4c9bef7b5124b04dc4cb73f
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Thu Feb 9 16:18:21 2012 -0500
runtime: Linux/ARM: exit early on OABI systems, and give an error message
Fixes #2533.
R=rsc
CC=golang-dev
https://golang.org/cl/5654045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/bb40196ebf50d461b4c9bef7b5124b04dc4cb73f
元コミット内容
このコミットは、GoランタイムがLinux上のARMアーキテクチャで実行される際に、OABI (Old Application Binary Interface) システムで早期に終了し、エラーメッセージを表示するように変更を加えるものです。これは、GoプログラムがEABI (Embedded Application Binary Interface) を前提としているため、OABI環境では正しく動作しない問題を解決することを目的としています。具体的には、GoのIssue #2533を修正します。
変更の背景
Go言語は、その設計上、特定のシステムコール規約やABI (Application Binary Interface) に依存しています。ARMアーキテクチャにおけるLinux環境では、OABI (Old Application Binary Interface) とEABI (Embedded Application Binary Interface) という2つの主要なABIが存在します。
- OABI (Old Application Binary Interface): これはARMの初期のABIであり、特に浮動小数点演算の扱いにおいて非効率な部分がありました。ハードウェアFPU (Floating Point Unit) がないシステムでは、FPU命令がカーネルレベルでエミュレートされ、これが非常に遅いコンテキストスイッチを引き起こしていました。
- EABI (Embedded Application Binary Interface): OABIの非効率性を改善するために設計された新しいABIです。EABIでは、FPU命令のエミュレーションをユーザー空間で行うことが可能になり、大幅な高速化が実現されました。Go言語は、このEABIを前提として設計されており、特にシステムコールやスタックフレームの管理においてEABIの規約に準拠しています。
GoプログラムがOABIシステム上で実行されると、ABIの不一致により、予期せぬ動作、クラッシュ、またはパフォーマンスの問題が発生する可能性がありました。このコミット以前は、GoランタイムはOABIシステム上で実行された際に、明確なエラーメッセージを出力せずにクラッシュするか、あるいは単に動作しないという問題がありました。
この変更の背景には、GoプログラムがEABI環境でのみ動作することを明確にし、OABIシステム上で実行された場合にユーザーに分かりやすい診断情報を提供することで、デバッグや互換性の問題を軽減するという目的があります。Issue #2533は、この互換性の問題と、それに対する明確なエラーハンドリングの必要性を提起していました。
前提知識の解説
ARMアーキテクチャにおけるABI (Application Binary Interface)
ABIは、オペレーティングシステムとアプリケーション、またはアプリケーションの異なるモジュール間で、どのようにデータがやり取りされ、関数が呼び出されるかといった低レベルの規約を定義します。ARMアーキテクチャでは、特にLinux環境において、OABIとEABIという2つの主要なABIが存在します。
- OABI (Old Application Binary Interface):
- ARMの初期のABI。
- 浮動小数点演算の処理が非効率的で、ハードウェアFPUがないシステムではカーネルによるエミュレーションが必要となり、パフォーマンスが低下する原因となっていました。
- システムコール規約もEABIとは異なります。
- EABI (Embedded Application Binary Interface):
- OABIの改善版として登場。
- 浮動小数点演算の効率が向上し、ユーザー空間でのエミュレーションが可能になりました。
- より効率的なスタックフレームの管理や、システムコール規約の改善が含まれます。
- Go言語はEABIに準拠しています。
ARMアセンブリとSWI
(Software Interrupt) 命令
ARMアセンブリは、ARMプロセッサの命令セットを記述するための低レベル言語です。SWI
(Software Interrupt) 命令は、ユーザーモードのプログラムがオペレーティングシステムに対して特権操作(システムコール)を要求するためのメカニズムです。
SWI
命令が実行されると、プロセッサは特権モード(通常はSupervisorモード)に切り替わり、特定のメモリアドレス(SWI例外ベクタ)にジャンプします。- このアドレスには、システムコールを処理するための例外ハンドラが配置されており、要求されたサービスを実行します。
- システムコールの番号や引数は、通常、特定のレジスタ(例: ARM EABIではR7にシステムコール番号、R0-R3に引数)に格納されて渡されます。
SIGILL
(Illegal Instruction) シグナル
SIGILL
は「不正命令」を意味するシグナルです。プロセスが不正な、特権的な、または形式が正しくない機械語命令を実行しようとしたときに、カーネルによってプロセスに送信されます。
- 発生原因:
- プログラムのバグ(コードがデータ領域を上書きするなど)。
- CPUがサポートしていない命令の実行(例: AVX2命令をサポートしないCPUでAVX2命令を含むコードを実行)。
- 実行ファイルやライブラリの破損。
- デフォルトの動作:
SIGILL
を受け取ったプロセスは、デフォルトで終了し、デバッグのためにコアダンプが生成されることがあります。 - シグナルハンドリング:
SIGILL
のシグナルハンドラを設定することは可能ですが、不正命令が発生した場所に戻ることはできません。
Linux ARMシステムコール規約
LinuxにおけるARMのシステムコール規約は、使用されるABIによって異なります。
- ARM 32-bit (EABI):
- システムコールは通常
swi #0
命令で開始されます。 - システムコール番号はレジスタ
R7
に渡されます。 - 最初の4つの引数はレジスタ
R0
からR3
に渡されます。それ以上の引数はスタックに渡されます。 - 戻り値はレジスタ
R0
に格納されます。
- システムコールは通常
- ARM 32-bit (OABI):
- OABIでは、システムコール番号は
swi NR
のようにSWI
命令の即値として渡されることがありました。これはEABIとは異なる点です。
- OABIでは、システムコール番号は
このコミットでは、EABIシステムコールを意図的に実行し、OABIシステムでSIGILL
が発生することを利用してABIを検出しています。
技術的詳細
このコミットの主要な目的は、GoランタイムがLinux/ARMシステム上で起動する際に、そのシステムがOABIであるかEABIであるかを検出し、OABIであれば早期にエラーメッセージを出力して終了することです。この検出は、EABI固有のシステムコールを試行し、その結果としてSIGILL
シグナルが発生するかどうかを監視するという巧妙な方法で行われます。
具体的な検出ロジックは以下のステップで構成されます。
-
SIGILL
ハンドラのセットアップ:- まず、
SIGILL
シグナル(シグナル番号4)が発生した際に呼び出されるシグナルハンドラbad_abi<>
を設定します。 sigaction
システムコール(システムコール番号174)を使用して、このハンドラを登録します。sigaction
は、シグナルに対するアクション(ハンドラ関数、フラグ、シグナルマスクなど)を設定するためのシステムコールです。- この
sigaction
システムコール自体は、OABIとEABIの両方で互換性のある方法で呼び出す必要があります。コミットでは、oabi_syscall<>
というヘルパー関数を介して呼び出されています。これは、Thumbモードに切り替えてSWI
命令を実行することで、OABI環境でも動作するように設計されています。
- まず、
-
EABIシステムコールの試行:
SIGILL
ハンドラが設定された後、EABI固有のシステムコールを意図的に実行します。- ここでは
sys_getpid
(システムコール番号20)が選択されています。これは、EABIのシステムコール規約に従ってレジスタR7
にシステムコール番号をセットし、SWI $0
命令を実行します。 - もしシステムがEABIであれば、このシステムコールは正常に実行され、
_rt0_arm
ラベルにジャンプしてGoランタイムの初期化が続行されます。 - もしシステムがOABIであれば、EABIのシステムコール規約に従って発行された
SWI $0
命令は、OABIカーネルにとっては不正な命令と解釈され、SIGILL
シグナルが発生します。
-
SIGILL
ハンドラでの処理:- OABIシステムで
SIGILL
が発生すると、事前に設定されたbad_abi<>
ハンドラが呼び出されます。 - このハンドラ内では、標準エラー出力(stderr)に「This program can only be run on EABI kernels」というエラーメッセージを出力します。
- メッセージ出力後、
sys_exit
システムコール(システムコール番号1)を呼び出し、終了コード1でプログラムを終了させます。これにより、GoプログラムはOABIシステム上で実行を継続することなく、ユーザーに明確なエラーメッセージを提示して終了します。
- OABIシステムで
このアプローチの鍵は、sigaction
システムコールの呼び出しと、エラーメッセージの出力および終了処理にoabi_syscall<>
というヘルパー関数を使用している点です。これは、OABI環境でも確実に動作するように、Thumbモードへの切り替えと特定のSWI
命令の組み合わせを利用して、OABI互換のシステムコール呼び出しを実現しています。これにより、ABI検出の初期段階で、Goランタイムがまだ完全に初期化されていない状態でも、安全にシステムコールを実行し、エラーハンドリングを行うことが可能になっています。
コアとなるコードの変更箇所
変更はsrc/pkg/runtime/rt0_linux_arm.s
ファイルに集中しています。
--- a/src/pkg/runtime/rt0_linux_arm.s
+++ b/src/pkg/runtime/rt0_linux_arm.s
@@ -2,5 +2,59 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.\n
-TEXT _rt0_arm_linux(SB),7,$0
+TEXT _rt0_arm_linux(SB),7,$-4
+ // We first need to detect the kernel ABI, and warn the user
+ // if the system only supports OABI
+ // The strategy here is to call some EABI syscall to see if
+ // SIGILL is received.
+ // To catch SIGILL, we have to first setup sigaction, this is
+ // a chicken-and-egg problem, because we can't do syscall if
+ // we don't know the kernel ABI... Oh, not really, we can do
+ // syscall in Thumb mode.
+
+ // set up sa_handler
+ MOVW $bad_abi<>(SB), R0 // sa_handler
+ MOVW $0, R1 // sa_flags
+ MOVW $0, R2 // sa_restorer
+ MOVW $0, R3 // sa_mask
+ MOVM.DB.W [R0-R3], (R13)
+ MOVW $4, R0 // SIGILL
+ MOVW R13, R1 // sa
+ MOVW $0, R2 // old_sa
+ MOVW $8, R3 // c
+ MOVW $174, R7 // sys_sigaction
+ BL oabi_syscall<>(SB)
+ ADD $16, R13
+ // do an EABI syscall
+ MOVW $20, R7 // sys_getpid
+ SWI $0 // this will trigger SIGILL on OABI systems
+
B _rt0_arm(SB)
+\n
+TEXT bad_abi<>(SB),7,$-4
+ // give diagnosis and exit
+ MOVW $2, R0 // stderr
+ MOVW $bad_abi_msg(SB), R1 // data
+ MOVW $45, R2 // len
+ MOVW $4, R7 // sys_write
+ BL oabi_syscall<>(SB)
+ MOVW $1, R0
+ MOVW $1, R7 // sys_exit
+ BL oabi_syscall<>(SB)
+ B 0(PC)
+\n
+DATA bad_abi_msg+0x00(SB)/8, $"This pro"\n
+DATA bad_abi_msg+0x08(SB)/8, $"gram can"\n
+DATA bad_abi_msg+0x10(SB)/8, $" only be"\n
+DATA bad_abi_msg+0x18(SB)/8, $" run on "\n
+DATA bad_abi_msg+0x20(SB)/8, $"EABI ker"\n
+DATA bad_abi_msg+0x28(SB)/4, $"nels"\n
+DATA bad_abi_msg+0x2c(SB)/1, $0xa\n
+GLOBL bad_abi_msg(SB), $45
+\n
+TEXT oabi_syscall<>(SB),7,$-4
+ ADD $1, PC, R4
+ WORD $0xe12fff14 //BX (R4) // enter thumb mode
+ // TODO(minux): only supports little-endian CPUs
+ WORD $0x4770df01 // swi $1; bx lr
コアとなるコードの解説
_rt0_arm_linux
関数内の変更
このセクションは、Goランタイムの初期エントリポイントである_rt0_arm_linux
関数の先頭に追加されたABI検出ロジックです。
TEXT _rt0_arm_linux(SB),7,$-4
// We first need to detect the kernel ABI, and warn the user
// if the system only supports OABI
// The strategy here is to call some EABI syscall to see if
// SIGILL is received.
// To catch SIGILL, we have to first setup sigaction, this is
// a chicken-and-egg problem, because we can't do syscall if
// we don't know the kernel ABI... Oh, not really, we can do
// syscall in Thumb mode.
// set up sa_handler
MOVW $bad_abi<>(SB), R0 // sa_handler
MOVW $0, R1 // sa_flags
MOVW $0, R2 // sa_restorer
MOVW $0, R3 // sa_mask
MOVM.DB.W [R0-R3], (R13)
MOVW $4, R0 // SIGILL
MOVW R13, R1 // sa
MOVW $0, R2 // old_sa
MOVW $8, R3 // c
MOVW $174, R7 // sys_sigaction
BL oabi_syscall<>(SB)
ADD $16, R13
// do an EABI syscall
MOVW $20, R7 // sys_getpid
SWI $0 // this will trigger SIGILL on OABI systems
B _rt0_arm(SB)
TEXT _rt0_arm_linux(SB),7,$-4
:_rt0_arm_linux
関数の定義。スタックフレームサイズが変更されています。- コメント: カーネルABIを検出し、OABIシステムであればユーザーに警告を出す目的を説明しています。
SIGILL
を捕捉するためにsigaction
を設定する必要があるが、ABIが不明な状態ではシステムコールが難しいという「鶏と卵」の問題に触れ、Thumbモードでのシステムコールが解決策であることを示唆しています。 MOVW $bad_abi<>(SB), R0 // sa_handler
:bad_abi
関数のアドレスをR0
レジスタにロードします。これはSIGILL
シグナルハンドラとして使用されます。MOVW $0, R1 // sa_flags
,MOVW $0, R2 // sa_restorer
,MOVW $0, R3 // sa_mask
:sigaction
構造体の他のフィールド(フラグ、レストアラー、シグナルマスク)をゼロに設定します。MOVM.DB.W [R0-R3], (R13)
:R0
からR3
までのレジスタの内容をスタックポインタR13
が指すアドレスにストアします。これにより、sigaction
構造体がスタック上に構築されます。MOVW $4, R0 // SIGILL
:SIGILL
シグナル(シグナル番号4)をR0
にロードします。これはsigaction
システムコールの最初の引数です。MOVW R13, R1 // sa
: スタック上のsigaction
構造体のアドレスをR1
にロードします。これはsigaction
システムコールの2番目の引数です。MOVW $0, R2 // old_sa
: 古いsigaction
構造体を格納する場所をR2
にロードします(ここではNULL)。MOVW $8, R3 // c
: これはsigaction
システムコールの引数の一部ですが、具体的な意味は文脈に依存します。Linuxのsigaction
システムコールは、sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)
という形式で、c
は通常使用されません。これは、Goランタイムが内部的に使用する特定の規約か、あるいは古いカーネルバージョンとの互換性のためのものかもしれません。MOVW $174, R7 // sys_sigaction
:sys_sigaction
システムコール番号(174)をR7
にロードします。BL oabi_syscall<>(SB)
:oabi_syscall
関数を呼び出します。この関数は、OABI互換の方法でシステムコールを実行します。ADD $16, R13
: スタックポインタR13
を16バイト分進めます。これは、sigaction
構造体(4ワード = 16バイト)がスタックからポップされたことを意味します。MOVW $20, R7 // sys_getpid
:sys_getpid
システムコール番号(20)をR7
にロードします。SWI $0 // this will trigger SIGILL on OABI systems
: EABIのシステムコール規約に従ってSWI $0
命令を実行します。OABIシステムでは、この命令は不正な命令と解釈され、SIGILL
シグナルが発生します。B _rt0_arm(SB)
: もしSIGILL
が発生しなければ(つまりEABIシステムであれば)、Goランタイムの通常の初期化ルーチンである_rt0_arm
にジャンプします。
bad_abi
関数
この関数は、OABIシステムでEABIシステムコールを試行した結果SIGILL
シグナルが発生した場合に呼び出されるシグナルハンドラです。
TEXT bad_abi<>(SB),7,$-4
// give diagnosis and exit
MOVW $2, R0 // stderr
MOVW $bad_abi_msg(SB), R1 // data
MOVW $45, R2 // len
MOVW $4, R7 // sys_write
BL oabi_syscall<>(SB)
MOVW $1, R0
MOVW $1, R7 // sys_exit
BL oabi_syscall<>(SB)
B 0(PC)
TEXT bad_abi<>(SB),7,$-4
:bad_abi
関数の定義。MOVW $2, R0 // stderr
: 標準エラー出力のファイルディスクリプタ(2)をR0
にロードします。MOVW $bad_abi_msg(SB), R1 // data
: エラーメッセージ文字列bad_abi_msg
のアドレスをR1
にロードします。MOVW $45, R2 // len
: メッセージの長さ(45バイト)をR2
にロードします。MOVW $4, R7 // sys_write
:sys_write
システムコール番号(4)をR7
にロードします。BL oabi_syscall<>(SB)
:oabi_syscall
関数を呼び出し、エラーメッセージを標準エラー出力に書き込みます。MOVW $1, R0
: 終了コード1をR0
にロードします。MOVW $1, R7 // sys_exit
:sys_exit
システムコール番号(1)をR7
にロードします。BL oabi_syscall<>(SB)
:oabi_syscall
関数を呼び出し、プログラムを終了させます。B 0(PC)
: ここには到達しませんが、関数の末尾に置かれる一般的なアセンブリの慣習です。
bad_abi_msg
データ
これは、OABIシステムでエラーが発生した場合に表示されるメッセージのデータ定義です。
DATA bad_abi_msg+0x00(SB)/8, $"This pro"
DATA bad_abi_msg+0x08(SB)/8, $"gram can"
DATA bad_abi_msg+0x10(SB)/8, $" only be"
DATA bad_abi_msg+0x18(SB)/8, $" run on "
DATA bad_abi_msg+0x20(SB)/8, $"EABI ker"
DATA bad_abi_msg+0x28(SB)/4, $"nels"
DATA bad_abi_msg+0x2c(SB)/1, $0xa
GLOBL bad_abi_msg(SB), $45
DATA ...
: 文字列「This program can only be run on EABI kernels」をバイト単位で定義しています。$0xa
: 改行文字(LF)を表します。GLOBL bad_abi_msg(SB), $45
:bad_abi_msg
をグローバルシンボルとして宣言し、そのサイズが45バイトであることを示します。
oabi_syscall
関数
この関数は、OABI環境でも確実に動作するように設計されたシステムコールラッパーです。
TEXT oabi_syscall<>(SB),7,$-4
ADD $1, PC, R4
WORD $0xe12fff14 //BX (R4) // enter thumb mode
// TODO(minux): only supports little-endian CPUs
WORD $0x4770df01 // swi $1; bx lr
TEXT oabi_syscall<>(SB),7,$-4
:oabi_syscall
関数の定義。ADD $1, PC, R4
: プログラムカウンタ(PC)に1を加算した値をR4
にロードします。これは、次の命令のアドレス(Thumbモードの命令)を計算するためです。WORD $0xe12fff14 //BX (R4) // enter thumb mode
: これはARM命令のバイナリ表現です。BX R4
命令に相当し、R4
レジスタの値に基づいてプロセッサをThumbモードに切り替えてジャンプします。Thumbモードは、ARM命令セットのサブセットであり、よりコンパクトなコードを生成できます。OABI環境でのシステムコールは、Thumbモードで実行されることで互換性が確保される場合があります。WORD $0x4770df01 // swi $1; bx lr
: これもARM命令のバイナリ表現です。swi $1
: ソフトウェア割り込み命令です。OABIでは、SWI
命令の即値がシステムコール番号として解釈されることがあります。ここでは$1
が使用されていますが、これは一般的なシステムコール番号ではなく、OABI環境での特定の動作を期待している可能性があります。bx lr
:lr
(リンクレジスタ)に格納されているアドレスにジャンプし、呼び出し元に戻ります。
このoabi_syscall
関数は、Goランタイムがまだ完全に初期化されていない非常に早い段階で、OABI環境でも安全にシステムコールを実行するための低レベルなトリックを使用しています。
関連リンク
- Go Issue #2533: https://github.com/golang/go/issues/2533 (ただし、検索結果によると、このIssue番号はGoのVS Code拡張機能の別の問題に関連している可能性があり、元のコミットが参照しているIssueとは異なる可能性があります。Goの古いIssueトラッカーのリンクが失われている可能性も考慮されます。)
- Go Code Review (CL): https://golang.org/cl/5654045
参考にした情報源リンク
- OABI vs EABI:
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGTJa9VkGRcHEu4HS-Fei4dSRjye-M9825D8kifjq0Xc-TyYSVCDCZQkQBBlXhcVGzKj9RH4Hn4OfJt2tuL74wbsC2l7FDUNKpaexVAYs37qZKxAlNeUROb9DOFxVzWgmYekZf_iUnqG3A9EfqyVfpOLBnkJfmqOHaEsZESd2sziRncuRYWL5YWTENRUKnIFTfqk=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHTD6rvPqzclEvEE31I6y33qHvYT5H5GI7DAXVF03GTcZHvt2nVmXjxl3YzmzOGjC1Jtx7uv6c3uxvmF9SVMXgzrnKSwfZfZOXHlFbW_Pt6kXMkLg1S2e7RyjfOJf3zNBHzlYY=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGApFcOa5iCwzDFakE9G5efrxJzw9psRpQkRCR15XMqeoUyaFsz_3enVXO8b6nqZV_Y7_1x-fMum1Dqyg7AecA9N4WRHgSaxhLYxnSmHV5fYLfTrYVA3PRjTaZiIamc
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEMljL2AQvt_zLfPbPlQIRpq5FAcLoqkdQX64Yns0skZN_Ug8TNIpSTnqqaweghpydEYH8--998zNGBnb79A2TJa-p1YNOJOjnIKlDUZIqym8Nq4TM=
- ARM
SWI
命令とシステムコール:- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEZ_5e9Vu-z98TIBFGLLrkpYGjYi24iWMOW06viMwR_imuAAvQYO8NhEDtKnKx95TrE-5RVSzr_yZ3ZHRisP8ztXzrfXPD8e8WMi1qFOm5sYlwFAuTqt5CcR6jinu97_149_ROxWBtNllgBOjl1rzzMCVy7YCnVDO3jq8wDem8HaJaTpH_MfKXg0q-llVC8nLUw1UlgbgeYeZgaeA==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHXXAfymJBZzFbW3Rq0YgUMYcvHMVDqkgmj4HTM16X8puJUhk9u0sv3VXeug7nyqEbAvZXXlH8UJ5XeyYgMM_TObo3IwEcPMg9_F7zb_-tEIRaYwxLzjzeBDkyY4C51W3gSdyCl5aISIahXcHRqQ8mfoA==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG7jD4gpUKWTT3Q6WYJan4phnuxL53Hp-ySfZA1psUe_uN4Ir4mv2Svr6M3-cX08RGIuJOzdiPaC_Lrfw6Qd5mau5Q2nVnIqrKEO4zkzXVMAPd2g4dpWvzACvv1h2l_4fhydp-zeAfffJU2wWu4wEtwEwwYMaa8FwlJPz5CGrjWKGQ_ztY37_1-9_-8nYwfuLjc0YlvWG1VDAAxbiRDxygVNg0_Vl3l3RTC
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH-BvSxO__kQVK1x7TGkV3MmlRdqqXtMOykFrIam5wg-ul9gjFm4vgvjr_3HchHHl0m66ZVCh1V6Jjm1yRBfpAo5BqjgkwNORhYSojeq872F55QOjPeZj_MQ6uFfeOlicVdlKsfy8Ju5crQAacFIjPnNiHOWtP1Dap4D7hgD1bFVdMSxmXU9oe9mAD6ilkmoICnw6rqwTTlMBXOVBbFZj8FKF3aPvPSbSDENY0-7GrAkA1T
SIGILL
シグナル:- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG7-QbKWFuB0R6y3uXa-9-iRaRgxACmgjeY4AuUPX-h0agwx4lD75yHkaHd-9dk_A69S1ypnhYnUDmNt8XoN4C4PGoBLx7VHe9YwmLoqBnnzPBwGSkMwawci0pfQpZeKnu1CBkiNmdas9xTAImhTZcloLEpCf9tY6Nayz52O520TwktTKAgxzZLsnGm
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEPIYpUlp9PGQAzel61nMrhaoytZ43Zlnr0DmGERXd2uvN4V7b195ClOuLAnKTbMrbptRcZj5sN5A-W8f1qQYU0NLsxWUeM0r1e8ayRVvjClOI4ZqiGHFhG5cLTQU6-CjtbZuXZMpy8
- Linux ARMシステムコール規約:
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEpBAWa9hHvl1pitw-lQfmuz2vxscPUYcVP_hKPYYOZJ9hqjz-WQkyhNpBmJtJInJr7jKjludSuPL4xrx849FY8msM3PLvH9DXofiZef7Uc83u895Z-JJAJ8okomNr-c0W4fu6lE-ZdVogMnvpYeC9aN8TYlIo=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEak_Xc81KRV0oz3FrV1MmWoyggnaQlwQ_g96FR5xwBZZ6VncO1n8bW81wsOHZv7Mt_vSFd5OZ_fp8YrQqH6nMBF3_ib5-UdAndt6sWRrVCvCjCZjc9AmoV_j9qKhzttAgDGQ==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFD1lK8FPd2a0OCgM3vo47eU_vjtPZZTOruKRkN17A9EuXBtKCIxPcs6BEVmqgH_Vph78jp-Xqxp1-zN2ofU9VJRwvEcGSCnrQLqsooMivuoM8V9f0PiwZ_e5hJIzQELLRqHZuTMBI6TR1O8CupleG_KWRDJFAUUoFmKnjdi_17VNzouaXU3PxFDVMD
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFY4H9x7fIRSnFGZUFIjNmVBAZdB0uJYooGwffKK9lTG0Xxz1BZUWkkmpjIpk9PFLlyqEUzxWZLKEYlg4T8x77IEFdSDA9fzERia5o3GCUa1wVGO8MfW8ntYJvhbHVeH1zRujvUOvBSyslah_ktObF5YgB4lyMiOn_PWbuX4AiDToWAQnIQW99w
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHuRUTzue5OYyESORf9Gomd2QK1jXaT2_at_LrwIIriTkTqcDkTLZIGmhFKbe10-FQ70rDZzj2H5Z2CocVsdzEZNYgP8jNRwf_Occ24AFKacTOa4_JoXINLq9uE0DStOWq7nf7ZZiKPK8f42S5h08TqQ3MgOGEcjjzHlwDzh-eYu2NzA_l8=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFH8bJFZSFwRTcg0XCqLViXFw14d9FrEKn_QopGAZMOF60NSaeu22BBnNCnGvoaG29B0EH8XxCg_FeQstBnlLQ-t48uyxmRuojQcdiZFrVbhH_mEnM9DGRKF2QcHF3BqE9FTRz7MnciSTM9QqNIufIFS80hZ4MH099bvH7TO9AAqqECjjKj6_q-3TKENW7ofGUQoVxaJIoB7yI6ZRxbRQiiEIp4V-qhsy6qciZiXJbXuhWk7IsfVJU=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE9KhH-H6ck6iogbgrJ4pdEeWCQQijEaJzbIeo4Qi1cG0RnWB13O0BW3SGt73VmRMNM2FB2oIC8yY-Oxv-M2Kxyc2WNyLHjCMjZX3yEOkAW5Csw57jP6QEYWH0leffhaqcaVR6izKnz18RcIW4VJFw=