ホームページ 運用・保守 Linuxの運用と保守 Linux での同じ名前のシンボル間の競合の解決策

Linux での同じ名前のシンボル間の競合の解決策

Jun 18, 2017 pm 01:36 PM
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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

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

Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Apr 01, 2025 pm 03:06 PM

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

ランプアーキテクチャの下でnode.jsまたはPythonサービスを効率的に統合する方法は? ランプアーキテクチャの下でnode.jsまたはPythonサービスを効率的に統合する方法は? Apr 01, 2025 pm 02:48 PM

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

APSChedulerタイミングタスクをMACOSのサービスとして構成する方法は? APSChedulerタイミングタスクをMACOSのサービスとして構成する方法は? Apr 01, 2025 pm 06:09 PM

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

WindowsやLinuxファイルを同期するときに、Compare Beyond Compareがケース感度に失敗した場合はどうすればよいですか? WindowsやLinuxファイルを同期するときに、Compare Beyond Compareがケース感度に失敗した場合はどうすればよいですか? Apr 01, 2025 am 08:06 AM

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

PythonインタープリターはLinuxシステムで削除できますか? PythonインタープリターはLinuxシステムで削除できますか? Apr 02, 2025 am 07:00 AM

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

マルチスレッドをC言語で実装する4つの方法 マルチスレッドをC言語で実装する4つの方法 Apr 03, 2025 pm 03:00 PM

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

See all articles