

以前まで正常に動いていたperlスクリプトが、以下のようにエラーを出すようになりました。

[code]

    perl: symbol lookup error: /usr/local/lib64/perl5/auto/JSON/XS/XS.so: undefined symbol: Perl_Gthr_key_ptr
    
[/code]

そこでCPANでエラーに書かれているライブラリをインストールしようとしても、以下のようにエラーとなります。

[code]

    cpan[1]> install JSON::XS       
    CPAN: Storable loaded ok (v2.45)
    Reading '/root/.cpan/Metadata'
      Database was generated on Fri, 09 Jan 2015 08:53:28 GMT
    CPAN: LWP::UserAgent loaded ok (v6.06)
    /usr/bin/perl: symbol lookup error: /usr/local/lib64/perl5/auto/Time/HiRes/HiRes.so: undefined symbol: Perl_Istack_sp_ptr
    
[/code]

先日まで問題なく動いていたのに、どのタイミングでこのような症状がでるようになったのかわかりません。  
サーバーはAWSのEC2で、OSはLinuxです。

原因がお分かりの方はいませんでしょうか？


CC BY-SA 3.0
2015-03-04T08:07:38.460
7429
2016-03-31T02:25:53.560
8679
question
linux perl aws
perlにて「symbol lookup error: undefined symbol: Perl_Gthr_key_ptr」エラーがでる


Linuxのlddコマンドで、エラーの出ている.soファイルを覗いてみてください。  
中にnot foundと出ている行があるはずです。

原因としてはおそらくPerlのバージョン違いのライブラリまたはバージョン違いの共通ライブラリを入れてしまい、シンボルが見つからないんだと思います。  
lddでnot foundと出たライブラリもしくはヘッダーを、使っているPerlのバージョンに合わせたもので再インストールすれば治ると思います。

[2015/03/18 EDIT]  
AWSのフォーラムに該当スレッドが既に存在しているようですね。  
<https://forums.aws.amazon.com/message.jspa?messageID=532885>  
Time::HiResを強制インストールすれば治るといってるようですが、試してみる価値はあると思います。

Googleへの検索キーワードは「AWS s3fs perl symbol lookup error」で上記スレッドがトップにヒットしましたよ。


CC BY-SA 3.0
2015-03-04T09:11:45.267
7434
2015-03-18T08:48:12.863
2015-03-18T08:48:12.863
3709
3709
7429
answer


まずすぐにバックアップとるのを強くおすすめします。  
EBSなら管理コンソールでスナップショットを作れば良いと思います。  
スナップショットについては AWS
の[ドキュメント](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-
restoring-volume.html)が詳しいですのでご覧ください。

CPAN で install がエラーに成ったのは `force install ...` だとどうでしょうか。  
参考) <http://jtes.net/2011/12/03/perl-perl_gthr_key_ptr-problems/>

上記でダメなら 最初にとったスナップショットからEBSにリストアすれば元の状態に戻ります。

次に、s3fsを入れたのが原因だと仮定しますと、その手前に yum で入れたパッケージの影響である可能性が推測できますので `sudo yum
history undo id` で s3fs を入れた時の yum を取り消してみるとどうですか。

`id` は `yum history list` を実行すると表示される `ID` の数値を入れて下さい。

[code]

    ID     | Command line             | Date and time    | Action(s)      | Altered
    -------------------------------------------------------------------------------
        32 | install xxxxx            | 2014-10-01 01:34 | Install        |    5
        31 | update                   | 2014-09-10 02:33 | Update         |   22
    
[/code]

上の例だと ID 32 を取り消すのであれば `sudo yum history undo 32` です。

それでもダメならまたスナップショットからリストアして下さい。（解決にはなりませんが…）


CC BY-SA 3.0
2015-10-15T15:01:30.670
17689
2015-10-15T15:01:30.670
5008
7429
answer


@SazaE
さんと同じように「以前まで正常に動いていたperlスクリプトがエラーになる」問題に遭遇しました。環境も同じで、AWSのAmazonLinuxを使用していました。

私の場合に表示されたエラーは以下のものでした。

[code]

    /usr/bin/perl: symbol lookup error: /usr/local/lib64/perl5/auto/version/vxs/vxs.so: undefined symbol: Perl_Gthr_key_ptr
    
[/code]

解決には @LainZero
さんが提供してくれた[AWSフォーラムのスレッド](https://forums.aws.amazon.com/message.jspa?messageID=532885)の中にある方法が役に立ちました。

[code]

    sudo env PERL5LIB=/usr/lib64/perl5/vendor_perl cpan -r
    
[/code]

(動的にロードされた全てのモジュールをリコンパイルする)

エラーの発生原因については、エラーが起きていることに気づくことが遅れたこともあり、見当がついていません。

なお、エラーを起こしていたスクリプトの冒頭では、以下の様にモジュールの使用を宣言していました。

[code]

    use Jcode;
    use File::Basename;
    use Data::Dumper;
    use LWP::UserAgent;
    use Archive::Extract;
    use Cwd;
    use Cwd 'abs_path';
    use DBI;
    
[/code]

この情報が助けになれば幸いです。それからともかく、ありがとうございました！


CC BY-SA 3.0
2016-03-31T02:25:53.560
23641
2016-03-31T02:25:53.560
14992
7429
answer