a lj @ st d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl m Z mZmZm Z mZ e e eeedf dddZe e e e dd d ZG dd deZee e d ddZe ee e dddZeee dddZedkrpddlZe ZedsJ dede edeej eddd ee dde!d d!d" D ]Z"ee"d#d q\dS )$zPEP 656 support. This module implements logic to detect if the currently running Python is linked against musl, and what musl version is used. N)IOIterator NamedTupleOptionalTuple.)ffmtreturnc C s t || t |S N)structunpackreadcalcsize)r r r D/usr/lib/python3.9/site-packages/pip/_vendor/packaging/_musllinux.py_read_unpacked s r )r r c C sh | d zt| d}W n tjy. Y dS 0 |dd tdkrHdS | tdd zdd d |d \}}}W n ty Y dS 0 tj| }zt| |\}}}}}}} W n tjy Y dS 0 t | d D ]} | ||| z|t| |\}}} W n tjy Y dS 0 |dkr,q| | t | | d}d |vr\ dS | S dS )zDetect musl libc location by parsing the Python executable. Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html r Z16BN s ELFZHHI )ZIIIIHHHZIIIIIIII)r r r )ZQQQIHHHZIIQQQQQQ)r )r r musl)seekr r errortupler KeyErroroperator itemgetterrangeosfsdecoder strip)r identZe_fmtZp_fmtZp_idxZp_get_Ze_phoffZe_phentsizeZe_phnumiZp_typeZp_offsetZp_fileszZinterpreterr r r _parse_ld_musl_from_elf sF r&