Linux での同じ名前のシンボル間の競合の解決策
この記事は、Linux で同じ名前のシンボルが競合する問題の解決策に関する関連情報を主に紹介します。必要な友人はそれを参照してください
Linux で同じ名前のシンボルが競合する問題の解決策
最近、仕事で次のような悲惨な状況に遭遇しました。 質問:
Linux には 3 つのモジュール aa、bb、および cc があります。 基本的な状況は次のとおりです。
cc はコンパイルされ、cc.so 動的ライブラリを取得するために接続されます。 cc には次の インターフェースがあります:
cc_fun { …… do();//调用名为do的cc模块内部函数 …… }
bb は bb.a static ライブラリを取得するためにコンパイルおよび接続されます。bb には次のインターフェースがあります:
bb_fun { …… handle = dlopen(cc.so, RTLD_LAZY);//加载cc.so pccfun = dlsym(handle, “cc_fun”);//获取cc_fun函数指针 (*pccfun)();//调用cc_fun函数,此时应该会调用cc模块中的do()函数 do();//调用名为do的bb模块内部函数(与cc模块中的do()函数同名,实现却不相同) …… }
aa コンパイル後、bb.a に接続します。 -lbb リンク オプションを使用して、aa 実行可能プログラムを取得し、インターフェイス関数 bb_fun( of bb.a ) を呼び出します。
main { …… bb_fun();//调用bb_fun函数 …… }
作業中に、aa が実行時に常に異常な動作をすることがわかりました。機能の異常を特定したところ、問題は同じ名前の do() 関数に集中していることがわかりました。出力の印刷により、プログラム内の do() 関数への 2 つの呼び出しが両方とも bb モジュールの do() 関数を呼び出しているのに対し、cc モジュールの do() 関数は一度も呼び出されず、その結果、異常が発生したことがわかりました。プログラムの動作とメモリ リーク。 何度も検証した結果、Linuxプログラムの各ライブラリのシンボルテーブルは、最終的にはプログラムが配置されているグローバルシンボルテーブルにロードされるため、このとき、同じ名前のシンボルが存在する場合のみ、最初にロードされたシンボルを呼び出すことができます。つまり、後でロードされた同じ名前のシンボルは、以前のシンボルによって上書きされます。 cc モジュールの do() 関数は bb モジュールの do() 関数によって上書きされるため、呼び出すことができません。
これ以上ナンセンスはありません。 。 。
多くの不満足な方法を試した結果、最終的な解決策は次のとおりです:1. -Wl,-Bsymbolic -Wl,--version-script,version 接続オプションを cc makefile に追加します。これは、バージョン内のスクリプトを意味します。ファイルは、エクスポートする関数を指定するために使用されます。
2.version ファイルの実装は次のとおりです。
VERS{ global: cc_fun; local: *; };
は、cc モジュールがインターフェイス関数 cc_fun のみをエクスポートするように指定され、他の関数はローカルに設定され、エクスポートされないことを意味します。
メイクファイルが存在するディレクトリにファイルを保存します。
3. 3 つのモジュールを再コンパイルして接続すると、問題は解決します。
以上がLinux での同じ名前のシンボル間の競合の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

エラーの原因とソリューションPECLを使用してDocker環境に拡張機能をインストールする場合、Docker環境を使用するときに、いくつかの頭痛に遭遇します...

多くのウェブサイト開発者は、ランプアーキテクチャの下でnode.jsまたはPythonサービスを統合する問題に直面しています:既存のランプ(Linux Apache MySQL PHP)アーキテクチャWebサイトのニーズ...

nginと同様に、APSChedulerタイミングタスクをサービスとして構成する場合、APSChedulerタイミングタスクをMACOSプラットフォームでサービスとして構成します...

compareを超えてファイルを比較して同期する問題:それ以降を使用する場合のケース感度障害...

Linux Systemsに付属するPythonインタープリターを削除する問題に関して、多くのLinuxディストリビューションは、インストール時にPythonインタープリターをプリインストールし、パッケージマネージャーを使用しません...

言語のマルチスレッドは、プログラムの効率を大幅に改善できます。 C言語でマルチスレッドを実装する4つの主な方法があります。独立したプロセスを作成します。独立して実行される複数のプロセスを作成します。各プロセスには独自のメモリスペースがあります。擬似マルチスレッド:同じメモリ空間を共有して交互に実行するプロセスで複数の実行ストリームを作成します。マルチスレッドライブラリ:pthreadsなどのマルチスレッドライブラリを使用して、スレッドを作成および管理し、リッチスレッド操作機能を提供します。 Coroutine:タスクを小さなサブタスクに分割し、順番に実行する軽量のマルチスレッド実装。
