Help us understand the problem. What is going on with this article?

pythonを三行でセグフォらせる

多分これが一番早いと思います。

$ docker run -ti python:3.8-slim bash
# pip install mysql-connector-python==8.0.20
# python
>>> import random
>>> import mysql.connector
Segmentation fault

何が起こっているのか。

前提

mysql-connector-pythonは8.0.20からlibcrypto.so.1.1libssl.so.1.1をbundleするようになりました。

$ pip show -f mysql-connector-python  | grep lib
Location: /usr/local/lib/python3.8/site-packages
  mysql-vendor/libcrypto.so.1.1
  mysql-vendor/libssl.so.1.1

解説

import random

randomをインポートすると libcrypto.so.1.1をロードします。
この時はシステムにインストールされた libcrypto.so.1.1をロードします。

import mysql.connector

このimport文でlibssl.so.1.1libcrypto.so.1.1をロードしようとします。
その際、libssl.so.1.1はバンドルされた独自のものをロードするのですが、
libcrypto.so.1.1はすでにロード済みなので、ロードしません。

したがって以下のような状態になります。

libcrypto.so.1.1 --> /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
libssl.so.1.1 --> /usr/local/lib/python3.8/site-packages/mysql-vendor/libssl.so.1.1

libcrypto.so.1.1に互換性がないため、segmentation faultとなります。

すでにbugとして報告されています。
https://bugs.mysql.com/bug.php?id=97220

回避策

  1. LD_PRELOADで /usr/local/lib/python3.8/site-packages/mysql-vendor/libssl.so.1.1等を読み込む
  2. 8.0.19以前のバージョンを使う。

追記

別にrandomを読み込まなくてもセグフォすることがわかりました。

>>> import mysql.connector
Segmentation Fault

上記の理屈だと若干説明がつかないので原因は別にあるようです。
LD_PRELOADで回避できるのでバンドルされたライブラリに読み込み順序に何か問題があることは確かだと思います。

ちなみに、不思議なのですが、 python:3.8-slimイメージでは発生しますが、 python:3.8イメージでは発生しません。

works-hi
「はたらく」を楽しく!に向けて大手企業の人事業務から変えていく HR業界のリーディングカンパニー
https://www.works-hi.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした