a [f,@szUddlZddlZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z m Z GdddZe edddZeddd Zedd d Zeed d dZeddZe eefed<Gddde Ze edddZe edddZe edddZee eefdddZee eefdddZeeeedd d!Z d"d#d$d%Z!eee ed&d'd(Z"dS))N)IODictIterator NamedTupleOptionalTuplec@s`eZdZGdddeZdZdZdZdZdZ dZ dZ dZ d Z d Zd Zd Zeed dddZd S)_ELFFileHeaderc@seZdZdZdS)z$_ELFFileHeader._InvalidELFFileHeaderz7 An invalid ELF file header was found. N)__name__ __module__ __qualname____doc__r r D/usr/lib/python3.9/site-packages/pip/_vendor/packaging/_manylinux.py_InvalidELFFileHeadersriFLE(>l~iiN)filereturncszttdfdd }|d|_|j|jkr2t|d|_|j|j|jhvrVt|d|_ |j |j |j hvrzt|d|_ |d|_ |d|_d|_|j |j krdnd}|j |j krd nd}|j |j krd nd }|j|jkr|n|}|||_|||_|||_|||_|||_|||_|||_|||_|||_|||_|||_|||_|||_dS) N)fmtrcsFz t|}t||}Wntjy<tYn0|dS)Nr)readstructcalcsizeunpackerrorrr)rdataresultrr rr$s z'_ELFFileHeader.__init__..unpackz>IBzHzQ)strintZ e_ident_magicELF_MAGIC_NUMBERrr e_ident_class ELFCLASS32 ELFCLASS64 e_ident_data ELFDATA2LSB ELFDATA2MSBZe_ident_versionZ e_ident_osabiZe_ident_abiversionrZ e_ident_padZe_type e_machineZ e_versionZe_entryZe_phoffZe_shoffe_flagsZe_ehsizeZ e_phentsizeZe_phnumZ e_shentsizeZe_shnumZ e_shstrndx)selfrrZformat_hZformat_iZformat_qZformat_pr r r__init__#s>                    z_ELFFileHeader.__init__)r r r ValueErrorrr%r'r(r*r+EM_386ZEM_S390EM_ARMZ EM_X86_64EF_ARM_ABIMASKEF_ARM_ABI_VER5EF_ARM_ABI_FLOAT_HARDrbytesr/r r r rrsr)rc CsZz8ttjd}t|}Wdn1s,0YWntttjfyTYdS0|S)Nrb)opensys executablerOSError TypeErrorr)f elf_headerr r r_get_elf_headerLs *r?cCsnt}|durdS|j|jk}||j|jkM}||j|jkM}||j|j@|j kM}||j|j @|j kM}|SNF) r?r&r'r)r*r,r2r-r3r4r5r>rr r r_is_linux_armhfUs   rBcCsBt}|durdS|j|jk}||j|jkM}||j|jkM}|Sr@)r?r&r'r)r*r,r1rAr r r_is_linux_i686hs rC)archrcCs$|dkrtS|dkrtS|dvS)NZarmv7li686>Zaarch64Zs390xZppc64lex86_64Zppc64)rBrC)rDr r r_have_compatible_abirs rGcCsdS)N2r r r r rrI_LAST_GLIBC_MINORc@seZdZUeed<eed<dS) _GLibCVersionmajorminorN)r r r r$__annotations__r r r rrLs rLc CsHz&td}|dusJ|\}}WnttttfyBYdS0|S)zJ Primary implementation of glibc_version_string using os.confstr. CS_GNU_LIBC_VERSIONN)osconfstrsplitAssertionErrorAttributeErrorr;r0)Zversion_string_versionr r r_glibc_version_string_confstrs  rXcCsz ddl}Wnty YdS0z|d}WntyDYdS0z |j}WntydYdS0|j|_|}t|t s| d}|S)zG Fallback implementation of glibc_version_string using ctypes. rNascii) ctypes ImportErrorZCDLLr;gnu_get_libc_versionrUZc_char_pZrestype isinstancer#decode)rZZprocess_namespacer\ version_strr r r_glibc_version_string_ctypess"       r`cCs tp tS)z9Returns glibc version string, or None if not using glibc.)rXr`r r r r_glibc_version_stringsra)r_rcCs@td|}|s$td|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: %srcrMrN)rematchwarningswarnRuntimeWarningr$group)r_mr r r_parse_glibc_versions rkcCst}|durdSt|S)Nrb)rark)r_r r r_get_glibc_versionsrl)namerDrWrcCst}||krdSz ddl}Wnty2YdS0t|drh||d|d|}|durdt|SdS|tddkrt|drt|jS|tdd krt|d rt|jS|tdd krt|d rt|j SdS) NFrTmanylinux_compatiblerrmanylinux1_compatible manylinux2010_compatiblemanylinux2014_compatible) rl _manylinuxr[hasattrrnboolrLrprrrt)rmrDrWZ sys_glibcrurr r r_is_compatibles,         rxZ manylinux2014Z manylinux2010Z manylinux1))rrs)rrq)rro)linuxrDrc cst|s dStdd}|dvr(tdd}tt}|g}t|jdddD]}t|}|t||qJ|D]}|j|jkr|j}nd}t|j|dD]^}t|j|} dj| } t | || r| d| V| t vrt | } t | || r| d| VqqldS) Nr>rFrErrczmanylinux_{}_{}ry) rGrLrlrangerMrKappendrNformatrxreplace_LEGACY_MANYLINUX_MAP) ryrDZtoo_old_glibc2Z current_glibcZglibc_max_listZ glibc_majorZ glibc_minorZ glibc_maxZ min_minorZ glibc_versiontagZ legacy_tagr r r platform_tags s.        r)# collections functoolsrQrdrr9rftypingrrrrrrrr?rwrBrCr#rG defaultdictrKr$rOrLrXr`rark lru_cacherlrxrrr r r rs4  =   ,