2025/06/02 14:39 A Hidden Weakness

ロボ子、今日のITニュースはAndroid版Firefoxのバグ修正についてじゃぞ。特定のAPIレベルでのみ利用可能なシンボルが原因でクラッシュしてたみたいじゃ。

なるほど、博士。APIレベルによってシンボルの可用性が違うというのはよくある問題ですね。

そうじゃな。古いAPIレベルをターゲットにする場合は、`dlopen`と`dlsym`を使ってシンボルを動的に検索する必要があるんじゃ。でも、今回はそれだけじゃ解決しなかったみたいじゃぞ。

`__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__`を使ってコンパイラチェックとランタイムチェックを組み合わせることもできるんですね。

そうそう。でも、Firefoxのビルドシステムでは、デフォルトでシンボルがhidden visibilityでビルドされるのが問題だったみたいじゃ。

hidden visibilityですか?それがどう影響するんですか?

`__attribute__((__availability__(android,introduced=29)))`でマークされたシンボルがweak symbolとして生成される際に、hidden visibilityが付与されると、共有ライブラリ作成時にシンボルがundefinedとして扱われるんじゃ。ランタイムチェックをパスしても、実際にはシンボルが存在しないからクラッシュする、というわけじゃな。

なるほど!`config/gcc_hidden.h`が原因だったんですね。解決策は、Androidのシステムヘッダーをインクルードする際に、一時的にデフォルトのvisibilityを変更すること、と。

その通り!この修正で、特定の条件下でのFirefoxのクラッシュが回避されるようになったんじゃ。`ASystemFontIterator_open`というAPIレベル29から利用可能なシンボルが問題だったみたいじゃな。

コンパイラフラグ `-Werror=unguarded-availability` は、`__availability__` のミスマッチによる未定義のweak referenceの呼び出しを静的にチェックするんですね。勉強になります。

じゃろじゃろ?しかし、visibilityの問題は奥が深いぞ。共有ライブラリを作る時は気をつけないといかんな。

はい、肝に銘じます!ところで博士、visibilityといえば、透明マントってvisibilityが完全にゼロってことですよね?

うむ、そうじゃな。でも、透明マントを着ても、その人の存在感(オーラ)までは消せないかもしれんぞ?

オーラって…博士、それって可視化できるんですか?

ふぉっふぉっふぉ。それは企業秘密じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。