
    g!              
          S SK Jr  S SKJr  S SKrS SKJr  S\4S jr	S\4S jr
S\\\4   S\\   S	\S
\S\R                  4
S jrS\\R"                     S\\   S\R                  S\R$                  4S jrS\R(                  S\R*                  4S jrSS\R.                  S\R0                  4S jjrS\R.                  S\4S jrg)    )	dataclass)	TracebackNsymbol_namec                    U R                  S5      (       a  [        R                  R                  $ U R                  S5      (       a   U S:w  a  [        R                  R                  $ [        R                  R                  $ )N.__start)
startswithelfSymbolBindingLOCALGLOBALr   s    -/mnt/public/Repos/urclelf/./elf/relocation.pydetermine_symbol_bindingr      sa    c""  &&&				$	$)@  '''  '''    c                     U R                  S5      (       a  [        R                  R                  $ [        R                  R                  $ )Nr   )r
   r   
SymbolTypeSECTIONNONEr   s    r   determine_symbol_typer      s3    c""~~%%%~~"""r   defined_symbolsundefined_symbolssymbol_name_tablesection_indexreturnc                 P   / n/ nU R                  5        H{  nXe;  d  M
  UR                  [        R                  " UR	                  UR                  S5      S-   5      X   S[        U5      [        U5      SU5      5        UR                  U5        M}     U H  nXe;  d  M
  UR                  [        R                  " UR	                  UR                  S5      S-   5      SS[        R                  R                  [        R                  R                  SS5      5        UR                  U5        M     UR                  S SS9  [        R                  " SSS[        R                  R                  [        R                  R                  SS5      /U-   n[        R                  " U5      $ )Nascii    r   c                 P    U R                   [        R                  R                  :H  $ N)bindingr   r   r   )ss    r   <lambda>#make_symbol_table.<locals>.<lambda>$   s    qyy#*;*;*A*AAr   T)keyreverse)keysappendr   Elf32SymbolTableEntryindexencoder   r   r   r   r   r   sortSymbolTable)r   r   r   r   entriesall_symbol_namesr   s          r   make_symbol_tabler1      s   /1G"$&++-.NN3445F5L5L[M_M_`gMhinMn5o  rA  rN  PQ  Sh  it  Su  wO  P[  w\  ^_  an  o  p##K0 .
 ).NN3445F5L5L[M_M_`gMhinMn5oqrtuwz  xF  xF  xK  xK  MP  M^  M^  Me  Me  gh  jk  l  m##K0 )
 LLA4LP((Aq#..2E2EsGXGXG_G_abdefgjqqG??7##r   relocationsdefined_symbol_namessymbol_tablec           	         / nU  H  nSn[        USS9 H  u  pgXtR                  :X  d  M  UnM     UR                  (       a  [        R                  R
                  nSn	O[        R                  R                  nSn	UR                  [        R                  " UR                  XU	5      5        M     [        R                  " U5      $ )Nr      )start)	enumerater   is_relativer   X86RelocationTypePC_RELATIVE_32	SIMPLE_32r)   RelocationTableEntryWithAddendr+   RelocationTable)
r2   r3   r4   r/   
relocationsymbol_indexr+   r   relocation_typeexplicit_addends
             r   make_relocation_tablerD   )   s    8:G!
"+,@"JE444$ #K !!!33BBO O!33==OOs99*:J:JOkz{| " w''r   	elf_classc                    [         R                  " [         R                  " U [         R                  R                  [         R
                  R                  5      [         R                  R                  U [         R                  R                  :X  a  [         R                  R                  O[         R                  R                  SSU [         R                  R                  :X  a  [         R                  O[         R                  SU [         R                  R                  :X  a  [         R                  O[         R                  SSU [         R                  R                  :X  a  [         R                   O[         R"                  SSS9$ )Nr   )elf_identifier	file_type
target_isaentry_pointprogram_header_offsetsection_header_offsetflagself_header_sizeprogram_header_entry_sizeprogram_header_countsection_header_entry_sizesection_header_countsection_header_name_index)r   	ElfHeaderELFIdentifier	EndianessLSBOSABISYSTEM_VFileTypeRELOCATABLEElfClassBITS_64	TargetISAX64X86ELF64_HEADER_SIZEELF32_HEADER_SIZEELF64_SECTION_HEADER_SIZEELF32_SECTION_HEADER_SIZE)rE   s    r   make_simple_elf_headerre   =   s    ==$'$5$5iARARTWT]T]TfTf$g$'LL$<$<9BcllFZFZ9ZCMM$5$5`c`m`m`q`q$%$%=F#,,J^J^=^C$9$9dgdydy$%=F#,,J^J^=^C$9$9dgdydy$%$%ENRUR^R^RfRfEfC$A$Alo  mJ  mJ$%$% r   relocatable_codec                 0   Sn[        U(       a  [        R                  R                  O[        R                  R                  5      nUR
                  Ul        SUl        X#R
                  -  n[        R                  R                  5       n[        R                  R                  [        R                  R                  5      n[        R                  R                  [        R                  R                  5      n[        R                  R                  [        R                  R                  5      n[        R                  R                  [        R                  R                  5      n[        R                  R                  [        R                  R                  5      n	[        R                   " [        R"                  R$                  R&                  [        R"                  R(                  R&                  [        R"                  R                  [        R"                  R                  R&                  [        R"                  R*                  R&                  [        R"                  R,                  R&                  /5      n
U
R/                  [        R"                  R(                  R&                  R1                  S5      5      Ul        U
R/                  [        R"                  R                  R&                  R1                  S5      5      Ul        U
R/                  [        R"                  R                  R&                  R1                  S5      5      Ul        U
R/                  [        R"                  R*                  R&                  R1                  S5      5      Ul        U
R/                  [        R"                  R,                  R&                  R1                  S5      5      U	l        X#R4                  S-  -  n[        R6                  " UUUUUU	/5      nUR8                  R/                  U5      Ul        UR8                  R/                  U5      Ul        UR8                  R/                  U	5      Ul        [        R@                  [        RB                  -  U	l"        U RG                  5       n[I        U RJ                  RM                  5       5      U-   n[        R                   " U5      n[O        U RJ                  XS5      nURQ                  5       Ul        UR8                  R/                  U5      Ul        URR                  RT                  [        R                  R                  :X  a  [        RV                  O[        RX                  Ul-        URR                  RT                  [        R                  R                  :X  a  [        R\                  O[        R^                  Ul-        [        R`                  " XRR                  RT                  5      n[        Rb                  " [e        U Rf                  X5      URR                  RT                  5      nSXUUU Rh                  /n0 n[k        S[m        UR8                  5      5       Ht  nX+R8                  U   l7        [m        UU   5      UR8                  U   l8        URs                  UR8                  U   Rn                  UU   05        U[m        UU   5      -  nMv     [        Rt                  " U[        Rv                  " / 5      UU5      $ )Nr      r      r   r6   )<re   r   r\   r]   BITS_32rN   rL   rR   Elf32SectionHeadernullblank_of_typeElf32SectionHeaderTypeSTRING_TABLESYMBOL_TABLEr[   PROGRAM_DATA!make_null_terminated_string_tableKnownSectionNamesNULLvalueSECTION_HEADER_STRING_TABLERELOCATION_TEXTTEXTr+   r,   
name_indexrQ   Elf32SectionHeaderTabler/   rS   
link_indexinfo	SHF_ALLOCSHF_EXECINSTRrM   get_undefined_label_nameslistsymbolsr(   r1   )get_symbol_index_of_first_nonlocal_symbolrG   rE   ELF64_SYMBOL_TABLE_ENTRY_SIZEELF32_SYMBOL_TABLE_ENTRY_SIZE
entry_size!ELF64_RELOCATION_TABLE_ENTRY_SIZE!ELF32_RELOCATION_TABLE_ENTRY_SIZEsymbol_table_to_bytesrelocation_table_to_bytesrD   r2   binaryrangelenfile_offset	file_sizeupdateElf32Elf32ProgramHeaderTable)rf   	is_64_bitr   
elf_headernull_section_headersection_names_section_header!symbol_table_names_section_headersymbol_table_section_headerrelocation_section_headertext_section_headersection_namessection_header_tableundefined_symbol_namesr0   symbol_name_table_bytesr4   symbol_table_bytesreloaction_table_bytessection_datasectionsr   s                        r   make_relocatable_elfr   O   sQ   K'	(<(<s||OcOcdJ'1'A'AJ$&'J#---K(+(>(>(C(C(E(+(>(>(L(LSMgMgMtMt(u (+(>(>(L(LSMgMgMtMt(u%(+(>(>(L(LSMgMgMtMt(u(+(>(>(L(LSMgMgMsMs(t(+(>(>(L(LSMgMgMtMt(u993;P;P;U;U;[;[]`]r]r  ^O  ^O  ^U  ^U  WZ  Wl  Wl  Wy  Wy  {~  {P  {P  {]  {]  {c  {c  eh  ez  ez  eJ  eJ  eP  eP  RU  Rg  Rg  Rl  Rl  Rr  Rr  ;s  tM3@3F3FsG\G\GxGxG~G~  HF  HF  GN  HO  4P +3@3F3FsG\G\GiGiGoGoGvGvw~G  4A%03@3F3FsG\G\GiGiGoGoGvGvw~G  4A*3@3F3FsG\G\GlGlGrGrGyGy  {B  HC  4D(3@3F3FsG\G\GaGaGgGgGnGnovGw3x"77!;;K66$)#!8  ,@+G+G+M+MNj+kJ(+?+G+G+M+MNi+j(%9%A%A%G%GH[%\" #0A0A A-GGI,4499;<?UU!CCDTU$%5%=%=?UpqrL'3']']'_$-A-I-I-O-OPq-r*R\RkRkRuRuy|  zF  zF  zN  zN  SNS-N-N  TW  Tu  Tu*T^TmTmTwTw{~  |H  |H  |P  |P  UP3+P+P  VY  V{  V{(22<AZAZAdAde ::;PQaQmQmo  <O  Q[  Qj  Qj  Qt  Qt  uASUkm}  nE  nE  FL!#Hq#&:&B&B"CDBM$$]3?@CLQ^D_@`$$]3=-55mDPPR^_lRmnos<677	 E 99Z!<!<R!@BVX`aar   c                 *    [        [        U 5      5      $ r!   )bytesr   )rf   s    r   compile_to_relocatable_filer      s    %&6788r   )F)dataclassesr   errorr   x86elf.structsstructsr   strr   r   dictintr   r   r.   r1   
Relocationr?   rD   r\   rT   re   AssembledMachineCoder   r   r    r   r   <module>r      s   !  
 (# (#s #$tCH~ $$s) $hm $  B $  GJ  GV  GV $&(tCNN'; (SWX[S\ (lol{l{ (  AD  AT  AT ((cll s}} $:b3+C+C :bY\YbYb :bx9#2J2J 9u 9r   