
    g!              
       >   d dl mZ d dlmZ d dlZd dlmZ defdZ	defdZ
deeef         dee         d	ed
edej        f
dZdeej                 dee         dej        dej        fdZdej        dej        fdZddej        dej        fdZdej        defdZdS )    )	dataclass)	TracebackNsymbol_namec                     |                      d          rt          j        j        S |                      d          r| dk    rt          j        j        S t          j        j        S )N.__start)
startswithelfSymbolBindingLOCALGLOBALr   s    K/media/seanl/Data/Files/Programming/Python/URCL/urclelf/./elf/relocation.pydetermine_symbol_bindingr      s\    c"" ( &&				$	$ ()@)@ '' ''    c                 p    |                      d          rt          j        j        S t          j        j        S )Nr   )r
   r   
SymbolTypeSECTIONNONEr   s    r   determine_symbol_typer      s.    c"" #~%%~""r   defined_symbolsundefined_symbolssymbol_name_tablesection_indexreturnc                 J   g }g }|                                  D ]}||vr|                    t          j        |                    |                    d          dz             | |         dt          |          t          |          d|                     |                    |           |D ]}||vr|                    t          j        |                    |                    d          dz             ddt          j        j	        t          j
        j        dd                     |                    |           |                    d d           t          j        dddt          j        j	        t          j
        j        dd          g|z   }t          j        |          S )Nascii    r   c                 6    | j         t          j        j        k    S N)bindingr   r   r   )ss    r   <lambda>z#make_symbol_table.<locals>.<lambda>$   s    qy#*;*AA r   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_tabler0      s   /1G"$&++-- 1 1...NN345F5L5L[M_M_`gMhMhinMn5o5o  rA  BM  rN  PQ  Sh  it  Su  Su  wO  P[  w\  w\  ^_  an  o  o  p  p  p##K000( 1 1...NN345F5L5L[M_M_`gMhMhinMn5o5oqrtuwz  xF  xK  MP  M^  Me  gh  jk  l  l  m  m  m##K000LLAA4LPPP(Aq#.2EsGXG_abdeffgjqqG?7###r   relocationsdefined_symbol_namessymbol_tablec           	      @   g }| D ]}d}t          |d          D ]\  }}||j        k    r|}|j        rt          j        j        }d}	nt          j        j        }d}	|                    t          j        |j	        |||	                     t          j
        |          S )Nr      )start)	enumerater   is_relativer   X86RelocationTypePC_RELATIVE_32	SIMPLE_32r(   RelocationTableEntryWithAddendr*   RelocationTable)
r1   r2   r3   r.   
relocationsymbol_indexr*   r   relocation_typeexplicit_addends
             r   make_relocation_tablerC   )   s    8:G! } }
"+,@"J"J"J 	 	E;j444$ 5 ! 	 !3BO OO!3=OOs9*:JO]ikz{{||||w'''r   	elf_classc                 2   t          j        t          j        | t           j        j        t           j        j                  t           j        j        | t           j	        j
        k    rt           j        j        nt           j        j        dd| t           j	        j
        k    rt           j        nt           j        d| t           j	        j
        k    rt           j        nt           j        dd| t           j	        j
        k    rt           j        nt           j        dd          S )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)rD   s    r   make_simple_elf_headerrd   =   s    =$'$5iARTWT]Tf$g$g$'L$<9BclFZ9Z9ZCM$5$5`c`m`q$%$%=F#,J^=^=^C$9$9dgdy$%=F#,J^=^=^C$9$9dgdy$%$%ENRUR^RfEfEfC$A$Alo  mJ$%$%   r   Frelocatable_codec                    d}t          |rt          j        j        nt          j        j                  }|j        |_        d|_        ||j        z  }t          j        	                                }t          j        
                    t          j        j                  }t          j        
                    t          j        j                  }t          j        
                    t          j        j                  }t          j        
                    t          j        j                  }t          j        
                    t          j        j                  }	t          j        t          j        j        j        t          j        j        j        t          j        j        t          j        j        j        t          j        j        j        t          j        j        j        g          }
|
                    t          j        j        j                            d                    |_        |
                    t          j        j        j                            d                    |_        |
                    t          j        j        j                            d                    |_        |
                    t          j        j        j                            d                    |_        |
                    t          j        j        j                            d                    |	_        ||j        dz  z  }t          j        ||||||	g          }|j                            |          |_        |j                            |          |_        |j                            |	          |_        t          j         t          j!        z  |	_"        | #                                }tI          | j%        &                                          |z   }t          j        |          }tO          | j%        ||d          }|(                                |_        |j                            |          |_        |j)        j*        t          j        j        k    rt          j+        nt          j,        |_-        |j)        j*        t          j        j        k    rt          j.        nt          j/        |_-        t          j0        ||j)        j*                  }t          j1        te          | j3        ||          |j)        j*                  }d|
|||| j4        g}i }tk          dtm          |j                            D ]~}||j        |         _7        tm          ||                   |j        |         _8        |9                    |j        |         j7        ||         i           |tm          ||                   z  }t          j:        |t          j;        g           ||          S )Nr      r      r   r5   )<rd   r   r[   r\   BITS_32rM   rK   rQ   Elf32SectionHeadernullblank_of_typeElf32SectionHeaderTypeSTRING_TABLESYMBOL_TABLErZ   PROGRAM_DATA!make_null_terminated_string_tableKnownSectionNamesNULLvalueSECTION_HEADER_STRING_TABLERELOCATION_TEXTTEXTr*   r+   
name_indexrP   Elf32SectionHeaderTabler.   rR   
link_indexinfo	SHF_ALLOCSHF_EXECINSTRrL   get_undefined_label_nameslistsymbolsr'   r0   )get_symbol_index_of_first_nonlocal_symbolrF   rD   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_bytesrC   r1   binaryrangelenfile_offset	file_sizeupdateElf32Elf32ProgramHeaderTable)re   	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_namesr/   symbol_name_table_bytesr3   symbol_table_bytesreloaction_table_bytessection_datasectionsr   s                        r   make_relocatable_elfr   O   s   K'	(c(<(<s|OcddJ'1'AJ$&'J#:--K(+(>(C(C(E(E(+(>(L(LSMgMt(u(u (+(>(L(LSMgMt(u(u%(+(>(L(LSMgMt(u(u(+(>(L(LSMgMs(t(t(+(>(L(LSMgMt(u(u93;P;U;[]`]r  ^O  ^U  WZ  Wl  Wy  {~  {P  {]  {c  eh  ez  eJ  eP  RU  Rg  Rl  Rr  ;s  t  tM3@3F3FsG\GxG~  HF  HF  GN  HO  HO  4P  4P +3@3F3FsG\GiGoGvGvw~GG  4A  4A%03@3F3FsG\GiGoGvGvw~GG  4A  4A*3@3F3FsG\GlGrGyGy  {B  HC  HC  4D  4D(3@3F3FsG\GaGgGnGnovGwGw3x3x":7!;;K6$)#!8   ,@+G+M+MNj+k+kJ(+?+G+M+MNi+j+j(%9%A%G%GH[%\%\" #0A A-GGII,499;;<<?UU!CDTUU$%5%=?UWnpqrrL'3']']'_'_$-A-I-O-OPq-r-r*R\RkRuy|  zF  zN  SN  SNS-N-N  TW  Tu*T^TmTw{~  |H  |P  UP  UP3+P+P  VY  V{(2<AZAdee :;PQaQmo  BN  <O  <O  Q[  Qj  Qt  u  u(?ASUkm}  nE  FL!#Hq#&:&B"C"CDD 8 8BM$]3?@CLQ^D_@`@`$]3=-5mDPR^_lRmnooos<67779Z!<R!@!@BVX`aaar   c                 :    t          t          |                     S r!   )bytesr   )re   s    r   compile_to_relocatable_filer      s    %&677888r   )F)dataclassesr   errorr   x86elf.structsstructsr   strr   r   dictintr   r   r-   r0   
Relocationr>   rC   r[   rS   rd   AssembledMachineCoder   r   r    r   r   <module>r      s   ! ! ! ! ! !       



      (# ( ( ( (#s # # # #$tCH~ $$s) $hm $  B $  GJ  GV $ $ $ $&(tCN'; (SWX[S\ (lol{ (  AD  AT ( ( ( ((cl s}    $:b :b3+C :bY\Yb :b :b :b :bx9#2J 9u 9 9 9 9 9 9r   