萌えハッカーニュースリーダー

2025/06/02 14:39 A Hidden Weakness

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

ふぉっふぉっふぉ。それは企業秘密じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search