o 5`,@sUddlZddlZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z m Z GdddZde efddZdefdd Zdefd d Zd edefd dZeddZe eefed<Gddde Zde efddZde efddZde efddZdede eeffddZede eeffddZded ed edefd!d"Z d#d$d%d&Z!d'ed ede efd(d)Z"dS)*N)IODictIterator NamedTupleOptionalTuplec@sbeZdZGdddeZdZdZdZdZdZ dZ dZ dZ d Z d Zd Zd Zd eeddfddZdS)_ELFFileHeaderc@seZdZdZdS)z$_ELFFileHeader._InvalidELFFileHeaderz7 An invalid ELF file header was found. N)__name__ __module__ __qualname____doc__r r 6/usr/lib/python3/dist-packages/packaging/_manylinux.py_InvalidELFFileHeadersriFLE(>l~iifilereturnNcs|dtdtffdd }|d|_|j|jkrt|d|_|j|j|jhvr,t|d|_ |j |j |j hvr>t|d|_ |d|_ |d|_d|_|j |j kr[dnd }|j |j kred nd}|j |j krod nd }|j|jkry|n|}|||_|||_|||_|||_|||_|||_|||_|||_|||_|||_|||_|||_|||_dS) Nfmtrcs@zt|}t||}W|dStjytw)Nr)readstructcalcsizeunpackerrorrr)rdataresultrr rr$sz'_ELFFileHeader.__init__..unpackz>IBzHzQ)strint e_ident_magicELF_MAGIC_NUMBERrr e_ident_class ELFCLASS32 ELFCLASS64 e_ident_data ELFDATA2LSB ELFDATA2MSBe_ident_version e_ident_osabie_ident_abiversionr e_ident_pade_type e_machine e_versione_entrye_phoffe_shoffe_flagse_ehsize e_phentsizee_phnum e_shentsizee_shnum e_shstrndx)selfrrformat_hformat_iformat_qformat_pr r r__init__#s>                    z_ELFFileHeader.__init__)r r r ValueErrorrr&r(r)r+r,EM_386EM_S390EM_ARM EM_X86_64EF_ARM_ABIMASKEF_ARM_ABI_VER5EF_ARM_ABI_FLOAT_HARDrbytesrCr r r rrsrrc Cs\zttjd}t|}WdW|S1swYW|Stttjfy-YdSw)Nrb)opensys executablerOSError TypeErrorr)f elf_headerr r r_get_elf_headerLs  rUcCsnt}|dur dS|j|jk}||j|jkM}||j|jkM}||j|j@|j kM}||j|j @|j kM}|SNF) rUr'r(r*r+r2rGr7rIrJrKrTrr r r_is_linux_armhfUs   rXcCsBt}|dur dS|j|jk}||j|jkM}||j|jkM}|SrV)rUr'r(r*r+r2rErWr r r_is_linux_i686hs rYarchcCs$|dkrtS|dkrtS|dvS)Narmv7li686>ppc64s390xx86_64aarch64ppc64le)rXrY)rZr r r_have_compatible_abirs rbcCsdS)N2r r r r rsrd_LAST_GLIBC_MINORc@seZdZUeed<eed<dS) _GLibCVersionmajorminorN)r r r r$__annotations__r r r rrfs  rfc CsFztd}|dus J|\}}W|Sttttfy"YdSw)zJ Primary implementation of glibc_version_string using os.confstr. CS_GNU_LIBC_VERSIONN)osconfstrsplitAssertionErrorAttributeErrorrQrD)version_string_versionr r r_glibc_version_string_confstrs  rscCszddl}Wn tyYdSwz|d}Wn ty"YdSwz|j}Wn ty2YdSw|j|_|}t|t sD| d}|S)zG Fallback implementation of glibc_version_string using ctypes. rNascii) ctypes ImportErrorCDLLrQgnu_get_libc_versionroc_char_prestype isinstancer#decode)ruprocess_namespacerx version_strr r r_glibc_version_string_ctypess(       rcCs tptS)z9Returns glibc version string, or None if not using glibc.)rsrr r r r_glibc_version_strings rr~cCs@td|}|std|tdSt|dt|dfS)a3Parse glibc version. We use a regexp instead of str.split because we want to discard any random junk that might come after the minor version -- this might happen in patched/forked versions of glibc (e.g. Linaro's version of glibc uses version strings like "2.20-2014.11"). See gh-3588. z$(?P[0-9]+)\.(?P[0-9]+)z=Expected glibc version with 2 components major.minor, got: %srrgrh)rematchwarningswarnRuntimeWarningr$group)r~mr r r_parse_glibc_versions rcCst}|dur dSt|S)Nr)rr)r~r r r_get_glibc_versionsrnamerrcCst}||kr dSzddl}Wn tyYdSwt|dr4||d|d|}|dur2t|SdS|tddkrEt|drEt|jS|tdd krVt|d rVt|jS|tdd krgt|d rgt|j SdS) NFrTmanylinux_compatiblerrmanylinux1_compatible manylinux2010_compatiblemanylinux2014_compatible) r _manylinuxrvhasattrrboolrfrrr)rrZrr sys_glibcrrr r r_is_compatibles.         r manylinux2014 manylinux2010 manylinux1))rr)rr)rrlinuxc cst|sdStdd}|dvrtdd}tt}|g}t|jdddD]}t|}|t||q&|D]E}|j|jkrC|j}nd}t|j|dD]/}t|j|} dj| } t | || rf| d| V| t vr{t | } t | || r{| d| VqLq7dS) Nr>r\r_rrzmanylinux_{}_{}r) rbrfrrangergreappendrhformatrreplace_LEGACY_MANYLINUX_MAP) rrZtoo_old_glibc2 current_glibcglibc_max_list glibc_major glibc_minor glibc_max min_minor glibc_versiontag legacy_tagr r r platform_tags s6        r)# collections functoolsrkrrrOrtypingrrrrrrrrUrrXrYr#rb defaultdictrer$rirfrsrrr lru_cacherrrrr r r rs6  =   ,