polyfile-weave 0.5.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of polyfile-weave might be problematic. Click here for more details.
- polyfile/__init__.py +15 -0
- polyfile/__main__.py +394 -0
- polyfile/arithmetic.py +27 -0
- polyfile/ast.py +114 -0
- polyfile/debugger.py +1039 -0
- polyfile/expressions.py +346 -0
- polyfile/fileutils.py +343 -0
- polyfile/html.py +135 -0
- polyfile/http/__init__.py +1 -0
- polyfile/http/defacto.py +37 -0
- polyfile/http/deprecated.py +51 -0
- polyfile/http/experimental.py +67 -0
- polyfile/http/http_11.py +548 -0
- polyfile/http/matcher.py +37 -0
- polyfile/http/structured_headers.py +48 -0
- polyfile/iterators.py +72 -0
- polyfile/jpeg.py +24 -0
- polyfile/kaitai/__init__.py +0 -0
- polyfile/kaitai/compiler.py +156 -0
- polyfile/kaitai/parser.py +312 -0
- polyfile/kaitai/parsers/__init__.py +0 -0
- polyfile/kaitai/parsers/aix_utmp.py +116 -0
- polyfile/kaitai/parsers/allegro_dat.py +367 -0
- polyfile/kaitai/parsers/andes_firmware.py +64 -0
- polyfile/kaitai/parsers/android_bootldr_asus.py +105 -0
- polyfile/kaitai/parsers/android_bootldr_huawei.py +181 -0
- polyfile/kaitai/parsers/android_bootldr_qcom.py +217 -0
- polyfile/kaitai/parsers/android_dto.py +138 -0
- polyfile/kaitai/parsers/android_img.py +319 -0
- polyfile/kaitai/parsers/android_nanoapp_header.py +83 -0
- polyfile/kaitai/parsers/android_opengl_shaders_cache.py +151 -0
- polyfile/kaitai/parsers/android_sparse.py +237 -0
- polyfile/kaitai/parsers/android_super.py +401 -0
- polyfile/kaitai/parsers/apm_partition_table.py +196 -0
- polyfile/kaitai/parsers/apple_single_double.py +180 -0
- polyfile/kaitai/parsers/asn1_der.py +235 -0
- polyfile/kaitai/parsers/au.py +138 -0
- polyfile/kaitai/parsers/avantes_roh60.py +112 -0
- polyfile/kaitai/parsers/avi.py +296 -0
- polyfile/kaitai/parsers/bcd.py +111 -0
- polyfile/kaitai/parsers/bitcoin_transaction.py +210 -0
- polyfile/kaitai/parsers/blender_blend.py +334 -0
- polyfile/kaitai/parsers/bmp.py +780 -0
- polyfile/kaitai/parsers/bson.py +411 -0
- polyfile/kaitai/parsers/btrfs_stream.py +318 -0
- polyfile/kaitai/parsers/bytes_with_io.py +27 -0
- polyfile/kaitai/parsers/chrome_pak.py +194 -0
- polyfile/kaitai/parsers/code_6502.py +456 -0
- polyfile/kaitai/parsers/compressed_resource.py +217 -0
- polyfile/kaitai/parsers/cpio_old_le.py +154 -0
- polyfile/kaitai/parsers/cramfs.py +344 -0
- polyfile/kaitai/parsers/creative_voice_file.py +342 -0
- polyfile/kaitai/parsers/dbf.py +274 -0
- polyfile/kaitai/parsers/dcmp_0.py +664 -0
- polyfile/kaitai/parsers/dcmp_1.py +422 -0
- polyfile/kaitai/parsers/dcmp_2.py +312 -0
- polyfile/kaitai/parsers/dcmp_variable_length_integer.py +66 -0
- polyfile/kaitai/parsers/dex.py +1086 -0
- polyfile/kaitai/parsers/dicom.py +4370 -0
- polyfile/kaitai/parsers/dime_message.py +201 -0
- polyfile/kaitai/parsers/dns_packet.py +569 -0
- polyfile/kaitai/parsers/doom_wad.py +654 -0
- polyfile/kaitai/parsers/dos_datetime.py +191 -0
- polyfile/kaitai/parsers/dos_mz.py +172 -0
- polyfile/kaitai/parsers/ds_store.py +513 -0
- polyfile/kaitai/parsers/dtb.py +310 -0
- polyfile/kaitai/parsers/dune_2_pak.py +126 -0
- polyfile/kaitai/parsers/edid.py +472 -0
- polyfile/kaitai/parsers/efivar_signature_list.py +331 -0
- polyfile/kaitai/parsers/elf.py +2482 -0
- polyfile/kaitai/parsers/ethernet_frame.py +114 -0
- polyfile/kaitai/parsers/exif.py +723 -0
- polyfile/kaitai/parsers/ext2.py +537 -0
- polyfile/kaitai/parsers/fallout2_dat.py +187 -0
- polyfile/kaitai/parsers/fallout_dat.py +156 -0
- polyfile/kaitai/parsers/fasttracker_xm_module.py +558 -0
- polyfile/kaitai/parsers/ftl_dat.py +90 -0
- polyfile/kaitai/parsers/genmidi_op2.py +161 -0
- polyfile/kaitai/parsers/gettext_mo.py +541 -0
- polyfile/kaitai/parsers/gif.py +492 -0
- polyfile/kaitai/parsers/gimp_brush.py +244 -0
- polyfile/kaitai/parsers/glibc_utmp.py +114 -0
- polyfile/kaitai/parsers/gltf_binary.py +132 -0
- polyfile/kaitai/parsers/google_protobuf.py +151 -0
- polyfile/kaitai/parsers/gpt_partition_table.py +175 -0
- polyfile/kaitai/parsers/gran_turismo_vol.py +140 -0
- polyfile/kaitai/parsers/grub2_font.py +337 -0
- polyfile/kaitai/parsers/gzip.py +232 -0
- polyfile/kaitai/parsers/hashcat_restore.py +60 -0
- polyfile/kaitai/parsers/hccap.py +111 -0
- polyfile/kaitai/parsers/hccapx.py +103 -0
- polyfile/kaitai/parsers/heaps_pak.py +177 -0
- polyfile/kaitai/parsers/heroes_of_might_and_magic_agg.py +116 -0
- polyfile/kaitai/parsers/heroes_of_might_and_magic_bmp.py +34 -0
- polyfile/kaitai/parsers/icmp_packet.py +136 -0
- polyfile/kaitai/parsers/ico.py +129 -0
- polyfile/kaitai/parsers/id3v1_1.py +220 -0
- polyfile/kaitai/parsers/id3v2_3.py +324 -0
- polyfile/kaitai/parsers/id3v2_4.py +423 -0
- polyfile/kaitai/parsers/ines.py +282 -0
- polyfile/kaitai/parsers/ipv4_packet.py +158 -0
- polyfile/kaitai/parsers/ipv6_packet.py +55 -0
- polyfile/kaitai/parsers/iso9660.py +544 -0
- polyfile/kaitai/parsers/java_class.py +1113 -0
- polyfile/kaitai/parsers/jpeg.py +361 -0
- polyfile/kaitai/parsers/luks.py +149 -0
- polyfile/kaitai/parsers/lzh.py +165 -0
- polyfile/kaitai/parsers/mac_os_resource_snd.py +493 -0
- polyfile/kaitai/parsers/mach_o.py +3033 -0
- polyfile/kaitai/parsers/mach_o_fat.py +92 -0
- polyfile/kaitai/parsers/magicavoxel_vox.py +391 -0
- polyfile/kaitai/parsers/manifest.json +1 -0
- polyfile/kaitai/parsers/mbr_partition_table.py +119 -0
- polyfile/kaitai/parsers/mcap.py +1015 -0
- polyfile/kaitai/parsers/microsoft_cfb.py +293 -0
- polyfile/kaitai/parsers/microsoft_network_monitor_v2.py +309 -0
- polyfile/kaitai/parsers/microsoft_pe.py +765 -0
- polyfile/kaitai/parsers/mifare_classic.py +706 -0
- polyfile/kaitai/parsers/minecraft_nbt.py +449 -0
- polyfile/kaitai/parsers/monomakh_sapr_chg.py +69 -0
- polyfile/kaitai/parsers/mozilla_mar.py +239 -0
- polyfile/kaitai/parsers/mp4.py +333 -0
- polyfile/kaitai/parsers/msgpack.py +467 -0
- polyfile/kaitai/parsers/nitf.py +1189 -0
- polyfile/kaitai/parsers/nt_mdt_pal.py +155 -0
- polyfile/kaitai/parsers/ogg.py +118 -0
- polyfile/kaitai/parsers/openpgp_message.py +993 -0
- polyfile/kaitai/parsers/packet_ppi.py +515 -0
- polyfile/kaitai/parsers/pcap.py +344 -0
- polyfile/kaitai/parsers/pcf_font.py +506 -0
- polyfile/kaitai/parsers/pcx.py +195 -0
- polyfile/kaitai/parsers/pcx_dcx.py +79 -0
- polyfile/kaitai/parsers/phar_without_stub.py +399 -0
- polyfile/kaitai/parsers/php_serialized_value.py +505 -0
- polyfile/kaitai/parsers/png.py +721 -0
- polyfile/kaitai/parsers/protocol_body.py +260 -0
- polyfile/kaitai/parsers/psx_tim.py +104 -0
- polyfile/kaitai/parsers/python_pickle.py +718 -0
- polyfile/kaitai/parsers/python_pyc_27.py +510 -0
- polyfile/kaitai/parsers/quake_mdl.py +441 -0
- polyfile/kaitai/parsers/quake_pak.py +112 -0
- polyfile/kaitai/parsers/quicktime_mov.py +634 -0
- polyfile/kaitai/parsers/rar.py +265 -0
- polyfile/kaitai/parsers/regf.py +569 -0
- polyfile/kaitai/parsers/renderware_binary_stream.py +877 -0
- polyfile/kaitai/parsers/resource_fork.py +611 -0
- polyfile/kaitai/parsers/respack.py +57 -0
- polyfile/kaitai/parsers/riff.py +409 -0
- polyfile/kaitai/parsers/rpm.py +964 -0
- polyfile/kaitai/parsers/rtcp_payload.py +579 -0
- polyfile/kaitai/parsers/rtp_packet.py +150 -0
- polyfile/kaitai/parsers/rtpdump.py +115 -0
- polyfile/kaitai/parsers/ruby_marshal.py +423 -0
- polyfile/kaitai/parsers/s3m.py +493 -0
- polyfile/kaitai/parsers/saints_row_2_vpp_pc.py +254 -0
- polyfile/kaitai/parsers/shapefile_index.py +174 -0
- polyfile/kaitai/parsers/shapefile_main.py +893 -0
- polyfile/kaitai/parsers/some_ip.py +209 -0
- polyfile/kaitai/parsers/some_ip_container.py +37 -0
- polyfile/kaitai/parsers/some_ip_sd.py +86 -0
- polyfile/kaitai/parsers/some_ip_sd_entries.py +160 -0
- polyfile/kaitai/parsers/some_ip_sd_options.py +374 -0
- polyfile/kaitai/parsers/specpr.py +404 -0
- polyfile/kaitai/parsers/sqlite3.py +472 -0
- polyfile/kaitai/parsers/ssh_public_key.py +252 -0
- polyfile/kaitai/parsers/standard_midi_file.py +390 -0
- polyfile/kaitai/parsers/stl.py +111 -0
- polyfile/kaitai/parsers/sudoers_ts.py +201 -0
- polyfile/kaitai/parsers/swf.py +406 -0
- polyfile/kaitai/parsers/systemd_journal.py +361 -0
- polyfile/kaitai/parsers/tcp_segment.py +57 -0
- polyfile/kaitai/parsers/tga.py +213 -0
- polyfile/kaitai/parsers/tls_client_hello.py +293 -0
- polyfile/kaitai/parsers/tr_dos_image.py +322 -0
- polyfile/kaitai/parsers/tsm.py +198 -0
- polyfile/kaitai/parsers/ttf.py +1847 -0
- polyfile/kaitai/parsers/udp_datagram.py +42 -0
- polyfile/kaitai/parsers/uefi_te.py +236 -0
- polyfile/kaitai/parsers/uimage.py +198 -0
- polyfile/kaitai/parsers/utf8_string.py +137 -0
- polyfile/kaitai/parsers/vfat.py +410 -0
- polyfile/kaitai/parsers/vlq_base128_be.py +104 -0
- polyfile/kaitai/parsers/vlq_base128_le.py +129 -0
- polyfile/kaitai/parsers/vmware_vmdk.py +167 -0
- polyfile/kaitai/parsers/vp8_ivf.py +112 -0
- polyfile/kaitai/parsers/warcraft_2_pud.py +423 -0
- polyfile/kaitai/parsers/wav.py +1014 -0
- polyfile/kaitai/parsers/websocket.py +167 -0
- polyfile/kaitai/parsers/windows_evt_log.py +304 -0
- polyfile/kaitai/parsers/windows_lnk_file.py +467 -0
- polyfile/kaitai/parsers/windows_minidump.py +575 -0
- polyfile/kaitai/parsers/windows_resource_file.py +243 -0
- polyfile/kaitai/parsers/windows_shell_items.py +190 -0
- polyfile/kaitai/parsers/windows_systemtime.py +52 -0
- polyfile/kaitai/parsers/wmf.py +502 -0
- polyfile/kaitai/parsers/xar.py +181 -0
- polyfile/kaitai/parsers/xwd.py +189 -0
- polyfile/kaitai/parsers/zip.py +685 -0
- polyfile/kaitai/parsers/zisofs.py +158 -0
- polyfile/kaitai/parsers/zx_spectrum_tap.py +184 -0
- polyfile/kaitaimatcher.py +113 -0
- polyfile/languagematcher.py +217 -0
- polyfile/logger.py +135 -0
- polyfile/magic.py +2983 -0
- polyfile/magic_defs/COPYING +29 -0
- polyfile/magic_defs/__init__.py +0 -0
- polyfile/magic_defs/acorn +102 -0
- polyfile/magic_defs/adi +13 -0
- polyfile/magic_defs/adventure +122 -0
- polyfile/magic_defs/aes +29 -0
- polyfile/magic_defs/algol68 +35 -0
- polyfile/magic_defs/allegro +9 -0
- polyfile/magic_defs/alliant +18 -0
- polyfile/magic_defs/alpha +32 -0
- polyfile/magic_defs/amanda +12 -0
- polyfile/magic_defs/amigaos +218 -0
- polyfile/magic_defs/android +259 -0
- polyfile/magic_defs/animation +1197 -0
- polyfile/magic_defs/aout +46 -0
- polyfile/magic_defs/apache +28 -0
- polyfile/magic_defs/apl +7 -0
- polyfile/magic_defs/apple +773 -0
- polyfile/magic_defs/application +7 -0
- polyfile/magic_defs/applix +13 -0
- polyfile/magic_defs/apt +52 -0
- polyfile/magic_defs/archive +2586 -0
- polyfile/magic_defs/aria +38 -0
- polyfile/magic_defs/arm +50 -0
- polyfile/magic_defs/asf +132 -0
- polyfile/magic_defs/assembler +18 -0
- polyfile/magic_defs/asterix +18 -0
- polyfile/magic_defs/att3b +41 -0
- polyfile/magic_defs/audio +1291 -0
- polyfile/magic_defs/avm +33 -0
- polyfile/magic_defs/basis +18 -0
- polyfile/magic_defs/beetle +7 -0
- polyfile/magic_defs/ber +65 -0
- polyfile/magic_defs/bflt +14 -0
- polyfile/magic_defs/bhl +10 -0
- polyfile/magic_defs/bioinformatics +178 -0
- polyfile/magic_defs/biosig +154 -0
- polyfile/magic_defs/blackberry +8 -0
- polyfile/magic_defs/blcr +25 -0
- polyfile/magic_defs/blender +50 -0
- polyfile/magic_defs/blit +24 -0
- polyfile/magic_defs/bm +10 -0
- polyfile/magic_defs/bout +11 -0
- polyfile/magic_defs/bsdi +33 -0
- polyfile/magic_defs/bsi +10 -0
- polyfile/magic_defs/btsnoop +13 -0
- polyfile/magic_defs/burp +7 -0
- polyfile/magic_defs/bytecode +41 -0
- polyfile/magic_defs/c-lang +110 -0
- polyfile/magic_defs/c64 +531 -0
- polyfile/magic_defs/cad +437 -0
- polyfile/magic_defs/cafebabe +107 -0
- polyfile/magic_defs/cbor +21 -0
- polyfile/magic_defs/ccf +14 -0
- polyfile/magic_defs/cddb +12 -0
- polyfile/magic_defs/chord +15 -0
- polyfile/magic_defs/cisco +12 -0
- polyfile/magic_defs/citrus +12 -0
- polyfile/magic_defs/clarion +27 -0
- polyfile/magic_defs/claris +48 -0
- polyfile/magic_defs/clipper +65 -0
- polyfile/magic_defs/clojure +30 -0
- polyfile/magic_defs/coff +98 -0
- polyfile/magic_defs/commands +201 -0
- polyfile/magic_defs/communications +22 -0
- polyfile/magic_defs/compress +461 -0
- polyfile/magic_defs/console +1213 -0
- polyfile/magic_defs/convex +69 -0
- polyfile/magic_defs/coverage +91 -0
- polyfile/magic_defs/cracklib +14 -0
- polyfile/magic_defs/crypto +31 -0
- polyfile/magic_defs/csv +8 -0
- polyfile/magic_defs/ctags +6 -0
- polyfile/magic_defs/ctf +23 -0
- polyfile/magic_defs/cubemap +8 -0
- polyfile/magic_defs/cups +56 -0
- polyfile/magic_defs/dact +11 -0
- polyfile/magic_defs/database +886 -0
- polyfile/magic_defs/dataone +47 -0
- polyfile/magic_defs/dbpf +15 -0
- polyfile/magic_defs/der +146 -0
- polyfile/magic_defs/diamond +12 -0
- polyfile/magic_defs/dif +33 -0
- polyfile/magic_defs/diff +41 -0
- polyfile/magic_defs/digital +59 -0
- polyfile/magic_defs/dolby +69 -0
- polyfile/magic_defs/dsf +25 -0
- polyfile/magic_defs/dump +96 -0
- polyfile/magic_defs/dwarfs +45 -0
- polyfile/magic_defs/dyadic +61 -0
- polyfile/magic_defs/ebml +8 -0
- polyfile/magic_defs/edid +11 -0
- polyfile/magic_defs/editors +43 -0
- polyfile/magic_defs/efi +15 -0
- polyfile/magic_defs/elf +379 -0
- polyfile/magic_defs/encore +22 -0
- polyfile/magic_defs/epoc +62 -0
- polyfile/magic_defs/erlang +21 -0
- polyfile/magic_defs/espressif +57 -0
- polyfile/magic_defs/esri +28 -0
- polyfile/magic_defs/etf +33 -0
- polyfile/magic_defs/fcs +9 -0
- polyfile/magic_defs/filesystems +2694 -0
- polyfile/magic_defs/finger +16 -0
- polyfile/magic_defs/firmware +133 -0
- polyfile/magic_defs/flash +62 -0
- polyfile/magic_defs/flif +36 -0
- polyfile/magic_defs/fonts +449 -0
- polyfile/magic_defs/forth +82 -0
- polyfile/magic_defs/fortran +9 -0
- polyfile/magic_defs/frame +62 -0
- polyfile/magic_defs/freebsd +164 -0
- polyfile/magic_defs/fsav +128 -0
- polyfile/magic_defs/fusecompress +12 -0
- polyfile/magic_defs/games +696 -0
- polyfile/magic_defs/gcc +17 -0
- polyfile/magic_defs/gconv +10 -0
- polyfile/magic_defs/gentoo +85 -0
- polyfile/magic_defs/geo +166 -0
- polyfile/magic_defs/geos +20 -0
- polyfile/magic_defs/gimp +77 -0
- polyfile/magic_defs/git +13 -0
- polyfile/magic_defs/glibc +21 -0
- polyfile/magic_defs/gnome +59 -0
- polyfile/magic_defs/gnu +173 -0
- polyfile/magic_defs/gnumeric +8 -0
- polyfile/magic_defs/gpt +240 -0
- polyfile/magic_defs/gpu +28 -0
- polyfile/magic_defs/grace +21 -0
- polyfile/magic_defs/graphviz +12 -0
- polyfile/magic_defs/gringotts +48 -0
- polyfile/magic_defs/guile +13 -0
- polyfile/magic_defs/hardware +12 -0
- polyfile/magic_defs/hitachi-sh +30 -0
- polyfile/magic_defs/hp +433 -0
- polyfile/magic_defs/human68k +26 -0
- polyfile/magic_defs/ibm370 +52 -0
- polyfile/magic_defs/ibm6000 +35 -0
- polyfile/magic_defs/icc +214 -0
- polyfile/magic_defs/iff +80 -0
- polyfile/magic_defs/images +4210 -0
- polyfile/magic_defs/inform +9 -0
- polyfile/magic_defs/intel +310 -0
- polyfile/magic_defs/interleaf +9 -0
- polyfile/magic_defs/island +10 -0
- polyfile/magic_defs/ispell +63 -0
- polyfile/magic_defs/isz +15 -0
- polyfile/magic_defs/java +52 -0
- polyfile/magic_defs/javascript +171 -0
- polyfile/magic_defs/jpeg +252 -0
- polyfile/magic_defs/json +8 -0
- polyfile/magic_defs/karma +9 -0
- polyfile/magic_defs/kde +11 -0
- polyfile/magic_defs/keepass +20 -0
- polyfile/magic_defs/kerberos +45 -0
- polyfile/magic_defs/kicad +85 -0
- polyfile/magic_defs/kml +34 -0
- polyfile/magic_defs/lammps +64 -0
- polyfile/magic_defs/lecter +6 -0
- polyfile/magic_defs/lex +12 -0
- polyfile/magic_defs/lif +50 -0
- polyfile/magic_defs/linux +557 -0
- polyfile/magic_defs/lisp +78 -0
- polyfile/magic_defs/llvm +22 -0
- polyfile/magic_defs/locoscript +12 -0
- polyfile/magic_defs/lua +31 -0
- polyfile/magic_defs/luks +126 -0
- polyfile/magic_defs/m4 +11 -0
- polyfile/magic_defs/mach +303 -0
- polyfile/magic_defs/macintosh +505 -0
- polyfile/magic_defs/macos +7 -0
- polyfile/magic_defs/magic +10 -0
- polyfile/magic_defs/magic.mgc +0 -0
- polyfile/magic_defs/mail.news +132 -0
- polyfile/magic_defs/make +21 -0
- polyfile/magic_defs/map +413 -0
- polyfile/magic_defs/maple +109 -0
- polyfile/magic_defs/marc21 +30 -0
- polyfile/magic_defs/mathcad +8 -0
- polyfile/magic_defs/mathematica +188 -0
- polyfile/magic_defs/matroska +17 -0
- polyfile/magic_defs/mcrypt +52 -0
- polyfile/magic_defs/measure +44 -0
- polyfile/magic_defs/mercurial +13 -0
- polyfile/magic_defs/metastore +8 -0
- polyfile/magic_defs/meteorological +53 -0
- polyfile/magic_defs/microfocus +21 -0
- polyfile/magic_defs/mime +9 -0
- polyfile/magic_defs/mips +120 -0
- polyfile/magic_defs/mirage +8 -0
- polyfile/magic_defs/misctools +140 -0
- polyfile/magic_defs/mkid +11 -0
- polyfile/magic_defs/mlssa +8 -0
- polyfile/magic_defs/mmdf +6 -0
- polyfile/magic_defs/modem +92 -0
- polyfile/magic_defs/modulefile +9 -0
- polyfile/magic_defs/motorola +71 -0
- polyfile/magic_defs/mozilla +37 -0
- polyfile/magic_defs/msdos +2304 -0
- polyfile/magic_defs/msooxml +68 -0
- polyfile/magic_defs/msvc +222 -0
- polyfile/magic_defs/msx +309 -0
- polyfile/magic_defs/mup +24 -0
- polyfile/magic_defs/music +17 -0
- polyfile/magic_defs/nasa +7 -0
- polyfile/magic_defs/natinst +24 -0
- polyfile/magic_defs/ncr +49 -0
- polyfile/magic_defs/neko +12 -0
- polyfile/magic_defs/netbsd +251 -0
- polyfile/magic_defs/netscape +26 -0
- polyfile/magic_defs/netware +11 -0
- polyfile/magic_defs/news +13 -0
- polyfile/magic_defs/nifty +202 -0
- polyfile/magic_defs/nim-lang +29 -0
- polyfile/magic_defs/nitpicker +14 -0
- polyfile/magic_defs/numpy +9 -0
- polyfile/magic_defs/oasis +12 -0
- polyfile/magic_defs/ocaml +14 -0
- polyfile/magic_defs/octave +6 -0
- polyfile/magic_defs/ole2compounddocs +760 -0
- polyfile/magic_defs/olf +98 -0
- polyfile/magic_defs/openfst +17 -0
- polyfile/magic_defs/opentimestamps +16 -0
- polyfile/magic_defs/oric +16 -0
- polyfile/magic_defs/os2 +186 -0
- polyfile/magic_defs/os400 +39 -0
- polyfile/magic_defs/os9 +80 -0
- polyfile/magic_defs/osf1 +10 -0
- polyfile/magic_defs/palm +156 -0
- polyfile/magic_defs/parix +13 -0
- polyfile/magic_defs/parrot +22 -0
- polyfile/magic_defs/pascal +39 -0
- polyfile/magic_defs/pbf +11 -0
- polyfile/magic_defs/pbm +8 -0
- polyfile/magic_defs/pc88 +24 -0
- polyfile/magic_defs/pc98 +77 -0
- polyfile/magic_defs/pci_ids +116 -0
- polyfile/magic_defs/pcjr +8 -0
- polyfile/magic_defs/pdf +51 -0
- polyfile/magic_defs/pdp +42 -0
- polyfile/magic_defs/perl +100 -0
- polyfile/magic_defs/pgf +52 -0
- polyfile/magic_defs/pgp +581 -0
- polyfile/magic_defs/pgp-binary-keys +388 -0
- polyfile/magic_defs/pkgadd +7 -0
- polyfile/magic_defs/plan9 +25 -0
- polyfile/magic_defs/playdate +57 -0
- polyfile/magic_defs/plus5 +18 -0
- polyfile/magic_defs/pmem +46 -0
- polyfile/magic_defs/polyfile_zip +5 -0
- polyfile/magic_defs/polyml +23 -0
- polyfile/magic_defs/printer +269 -0
- polyfile/magic_defs/project +10 -0
- polyfile/magic_defs/psdbms +14 -0
- polyfile/magic_defs/psl +14 -0
- polyfile/magic_defs/pulsar +13 -0
- polyfile/magic_defs/puzzle +17 -0
- polyfile/magic_defs/pwsafe +14 -0
- polyfile/magic_defs/pyramid +12 -0
- polyfile/magic_defs/python +305 -0
- polyfile/magic_defs/qt +30 -0
- polyfile/magic_defs/revision +66 -0
- polyfile/magic_defs/riff +840 -0
- polyfile/magic_defs/rinex +44 -0
- polyfile/magic_defs/ringdove +45 -0
- polyfile/magic_defs/rpi +52 -0
- polyfile/magic_defs/rpm +45 -0
- polyfile/magic_defs/rpmsg +7 -0
- polyfile/magic_defs/rst +11 -0
- polyfile/magic_defs/rtf +94 -0
- polyfile/magic_defs/ruby +55 -0
- polyfile/magic_defs/rust +21 -0
- polyfile/magic_defs/sc +7 -0
- polyfile/magic_defs/sccs +24 -0
- polyfile/magic_defs/scientific +144 -0
- polyfile/magic_defs/securitycerts +6 -0
- polyfile/magic_defs/selinux +24 -0
- polyfile/magic_defs/sendmail +37 -0
- polyfile/magic_defs/sequent +42 -0
- polyfile/magic_defs/sereal +35 -0
- polyfile/magic_defs/sgi +144 -0
- polyfile/magic_defs/sgml +161 -0
- polyfile/magic_defs/sharc +23 -0
- polyfile/magic_defs/sinclair +40 -0
- polyfile/magic_defs/sisu +18 -0
- polyfile/magic_defs/sketch +6 -0
- polyfile/magic_defs/smalltalk +25 -0
- polyfile/magic_defs/smile +34 -0
- polyfile/magic_defs/sniffer +482 -0
- polyfile/magic_defs/softquad +40 -0
- polyfile/magic_defs/sosi +40 -0
- polyfile/magic_defs/spec +21 -0
- polyfile/magic_defs/spectrum +184 -0
- polyfile/magic_defs/sql +288 -0
- polyfile/magic_defs/ssh +39 -0
- polyfile/magic_defs/ssl +20 -0
- polyfile/magic_defs/statistics +45 -0
- polyfile/magic_defs/subtitle +38 -0
- polyfile/magic_defs/sun +141 -0
- polyfile/magic_defs/svf +5 -0
- polyfile/magic_defs/sylk +36 -0
- polyfile/magic_defs/symbos +42 -0
- polyfile/magic_defs/sysex +429 -0
- polyfile/magic_defs/tcl +29 -0
- polyfile/magic_defs/teapot +6 -0
- polyfile/magic_defs/terminfo +63 -0
- polyfile/magic_defs/tex +141 -0
- polyfile/magic_defs/tgif +7 -0
- polyfile/magic_defs/ti-8x +239 -0
- polyfile/magic_defs/timezone +42 -0
- polyfile/magic_defs/tplink +95 -0
- polyfile/magic_defs/troff +38 -0
- polyfile/magic_defs/tuxedo +8 -0
- polyfile/magic_defs/typeset +8 -0
- polyfile/magic_defs/uf2 +72 -0
- polyfile/magic_defs/unicode +15 -0
- polyfile/magic_defs/unisig +12 -0
- polyfile/magic_defs/unknown +34 -0
- polyfile/magic_defs/usd +21 -0
- polyfile/magic_defs/uterus +16 -0
- polyfile/magic_defs/uuencode +28 -0
- polyfile/magic_defs/vacuum-cleaner +54 -0
- polyfile/magic_defs/varied.out +46 -0
- polyfile/magic_defs/varied.script +21 -0
- polyfile/magic_defs/vax +32 -0
- polyfile/magic_defs/vicar +17 -0
- polyfile/magic_defs/virtual +307 -0
- polyfile/magic_defs/virtutech +12 -0
- polyfile/magic_defs/visx +32 -0
- polyfile/magic_defs/vms +30 -0
- polyfile/magic_defs/vmware +6 -0
- polyfile/magic_defs/vorbis +155 -0
- polyfile/magic_defs/vxl +14 -0
- polyfile/magic_defs/warc +16 -0
- polyfile/magic_defs/weak +16 -0
- polyfile/magic_defs/web +18 -0
- polyfile/magic_defs/webassembly +17 -0
- polyfile/magic_defs/windows +1811 -0
- polyfile/magic_defs/wireless +7 -0
- polyfile/magic_defs/wordprocessors +630 -0
- polyfile/magic_defs/wsdl +23 -0
- polyfile/magic_defs/x68000 +25 -0
- polyfile/magic_defs/xdelta +13 -0
- polyfile/magic_defs/xenix +106 -0
- polyfile/magic_defs/xilinx +58 -0
- polyfile/magic_defs/xo65 +37 -0
- polyfile/magic_defs/xwindows +43 -0
- polyfile/magic_defs/yara +17 -0
- polyfile/magic_defs/zfs +96 -0
- polyfile/magic_defs/zilog +12 -0
- polyfile/magic_defs/zip +126 -0
- polyfile/magic_defs/zyxel +17 -0
- polyfile/nes.py +144 -0
- polyfile/nitf.py +15 -0
- polyfile/pdf.py +1264 -0
- polyfile/pickles.py +45 -0
- polyfile/polyfile.py +409 -0
- polyfile/profiling.py +115 -0
- polyfile/repl.py +624 -0
- polyfile/search.py +310 -0
- polyfile/serialization.py +323 -0
- polyfile/structmatcher.py +46 -0
- polyfile/structs.py +281 -0
- polyfile/templates/download.js +162 -0
- polyfile/templates/hexdump.css +268 -0
- polyfile/templates/hexdump.js +756 -0
- polyfile/templates/jquery-3.4.1.min.js +2 -0
- polyfile/templates/template.html +119 -0
- polyfile/wildcards.py +62 -0
- polyfile/zipmatcher.py +183 -0
- polyfile_weave-0.5.5.dist-info/METADATA +173 -0
- polyfile_weave-0.5.5.dist-info/RECORD +585 -0
- polyfile_weave-0.5.5.dist-info/WHEEL +5 -0
- polyfile_weave-0.5.5.dist-info/entry_points.txt +2 -0
- polyfile_weave-0.5.5.dist-info/licenses/LICENSE +202 -0
- polyfile_weave-0.5.5.dist-info/top_level.txt +2 -0
- polymerge/__init__.py +1 -0
- polymerge/__main__.py +296 -0
- polymerge/cfg.py +127 -0
- polymerge/polymerge.py +227 -0
- polymerge/polytracker.py +190 -0
|
@@ -0,0 +1,2482 @@
|
|
|
1
|
+
# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
|
|
2
|
+
|
|
3
|
+
from pkg_resources import parse_version
|
|
4
|
+
import kaitaistruct
|
|
5
|
+
from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO
|
|
6
|
+
from enum import Enum
|
|
7
|
+
import collections
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if parse_version(kaitaistruct.__version__) < parse_version('0.9'):
|
|
11
|
+
raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))
|
|
12
|
+
|
|
13
|
+
class Elf(KaitaiStruct):
|
|
14
|
+
"""
|
|
15
|
+
.. seealso::
|
|
16
|
+
Source - https://sourceware.org/git/?p=glibc.git;a=blob;f=elf/elf.h;hb=0f62fe0532
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
.. seealso::
|
|
20
|
+
Source - https://refspecs.linuxfoundation.org/elf/gabi4+/contents.html
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
.. seealso::
|
|
24
|
+
Source - https://docs.oracle.com/en/operating-systems/solaris/oracle-solaris/11.4/linkers-libraries/elf-application-binary-interface.html
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
class SymbolVisibility(Enum):
|
|
28
|
+
default = 0
|
|
29
|
+
internal = 1
|
|
30
|
+
hidden = 2
|
|
31
|
+
protected = 3
|
|
32
|
+
exported = 4
|
|
33
|
+
singleton = 5
|
|
34
|
+
eliminate = 6
|
|
35
|
+
|
|
36
|
+
class SymbolBinding(Enum):
|
|
37
|
+
local = 0
|
|
38
|
+
global_symbol = 1
|
|
39
|
+
weak = 2
|
|
40
|
+
os10 = 10
|
|
41
|
+
os11 = 11
|
|
42
|
+
os12 = 12
|
|
43
|
+
proc13 = 13
|
|
44
|
+
proc14 = 14
|
|
45
|
+
proc15 = 15
|
|
46
|
+
|
|
47
|
+
class Endian(Enum):
|
|
48
|
+
le = 1
|
|
49
|
+
be = 2
|
|
50
|
+
|
|
51
|
+
class ShType(Enum):
|
|
52
|
+
null_type = 0
|
|
53
|
+
progbits = 1
|
|
54
|
+
symtab = 2
|
|
55
|
+
strtab = 3
|
|
56
|
+
rela = 4
|
|
57
|
+
hash = 5
|
|
58
|
+
dynamic = 6
|
|
59
|
+
note = 7
|
|
60
|
+
nobits = 8
|
|
61
|
+
rel = 9
|
|
62
|
+
shlib = 10
|
|
63
|
+
dynsym = 11
|
|
64
|
+
init_array = 14
|
|
65
|
+
fini_array = 15
|
|
66
|
+
preinit_array = 16
|
|
67
|
+
group = 17
|
|
68
|
+
symtab_shndx = 18
|
|
69
|
+
relr = 19
|
|
70
|
+
sunw_symnsort = 1879048172
|
|
71
|
+
sunw_phname = 1879048173
|
|
72
|
+
sunw_ancillary = 1879048174
|
|
73
|
+
sunw_capchain = 1879048175
|
|
74
|
+
sunw_capinfo = 1879048176
|
|
75
|
+
sunw_symsort = 1879048177
|
|
76
|
+
sunw_tlssort = 1879048178
|
|
77
|
+
sunw_ldynsym = 1879048179
|
|
78
|
+
sunw_dof = 1879048180
|
|
79
|
+
sunw_cap = 1879048181
|
|
80
|
+
sunw_signature = 1879048182
|
|
81
|
+
sunw_annotate = 1879048183
|
|
82
|
+
sunw_debugstr = 1879048184
|
|
83
|
+
sunw_debug = 1879048185
|
|
84
|
+
sunw_move = 1879048186
|
|
85
|
+
sunw_comdat = 1879048187
|
|
86
|
+
sunw_syminfo = 1879048188
|
|
87
|
+
sunw_verdef = 1879048189
|
|
88
|
+
sunw_verneed = 1879048190
|
|
89
|
+
sunw_versym = 1879048191
|
|
90
|
+
sparc_gotdata = 1879048192
|
|
91
|
+
amd64_unwind = 1879048193
|
|
92
|
+
arm_preemptmap = 1879048194
|
|
93
|
+
arm_attributes = 1879048195
|
|
94
|
+
arm_debugoverlay = 1879048196
|
|
95
|
+
arm_overlaysection = 1879048197
|
|
96
|
+
|
|
97
|
+
class OsAbi(Enum):
|
|
98
|
+
system_v = 0
|
|
99
|
+
hp_ux = 1
|
|
100
|
+
netbsd = 2
|
|
101
|
+
gnu = 3
|
|
102
|
+
solaris = 6
|
|
103
|
+
aix = 7
|
|
104
|
+
irix = 8
|
|
105
|
+
freebsd = 9
|
|
106
|
+
tru64 = 10
|
|
107
|
+
modesto = 11
|
|
108
|
+
openbsd = 12
|
|
109
|
+
openvms = 13
|
|
110
|
+
nsk = 14
|
|
111
|
+
aros = 15
|
|
112
|
+
fenixos = 16
|
|
113
|
+
cloudabi = 17
|
|
114
|
+
openvos = 18
|
|
115
|
+
|
|
116
|
+
class Machine(Enum):
|
|
117
|
+
no_machine = 0
|
|
118
|
+
m32 = 1
|
|
119
|
+
sparc = 2
|
|
120
|
+
x86 = 3
|
|
121
|
+
m68k = 4
|
|
122
|
+
m88k = 5
|
|
123
|
+
iamcu = 6
|
|
124
|
+
i860 = 7
|
|
125
|
+
mips = 8
|
|
126
|
+
s370 = 9
|
|
127
|
+
mips_rs3_le = 10
|
|
128
|
+
parisc = 15
|
|
129
|
+
vpp500 = 17
|
|
130
|
+
sparc32plus = 18
|
|
131
|
+
i960 = 19
|
|
132
|
+
powerpc = 20
|
|
133
|
+
powerpc64 = 21
|
|
134
|
+
s390 = 22
|
|
135
|
+
spu = 23
|
|
136
|
+
v800 = 36
|
|
137
|
+
fr20 = 37
|
|
138
|
+
rh32 = 38
|
|
139
|
+
rce = 39
|
|
140
|
+
arm = 40
|
|
141
|
+
old_alpha = 41
|
|
142
|
+
superh = 42
|
|
143
|
+
sparc_v9 = 43
|
|
144
|
+
tricore = 44
|
|
145
|
+
arc = 45
|
|
146
|
+
h8_300 = 46
|
|
147
|
+
h8_300h = 47
|
|
148
|
+
h8s = 48
|
|
149
|
+
h8_500 = 49
|
|
150
|
+
ia_64 = 50
|
|
151
|
+
mips_x = 51
|
|
152
|
+
coldfire = 52
|
|
153
|
+
m68hc12 = 53
|
|
154
|
+
mma = 54
|
|
155
|
+
pcp = 55
|
|
156
|
+
ncpu = 56
|
|
157
|
+
ndr1 = 57
|
|
158
|
+
starcore = 58
|
|
159
|
+
me16 = 59
|
|
160
|
+
st100 = 60
|
|
161
|
+
tinyj = 61
|
|
162
|
+
x86_64 = 62
|
|
163
|
+
pdsp = 63
|
|
164
|
+
pdp10 = 64
|
|
165
|
+
pdp11 = 65
|
|
166
|
+
fx66 = 66
|
|
167
|
+
st9plus = 67
|
|
168
|
+
st7 = 68
|
|
169
|
+
mc68hc16 = 69
|
|
170
|
+
mc68hc11 = 70
|
|
171
|
+
mc68hc08 = 71
|
|
172
|
+
mc68hc05 = 72
|
|
173
|
+
svx = 73
|
|
174
|
+
st19 = 74
|
|
175
|
+
vax = 75
|
|
176
|
+
cris = 76
|
|
177
|
+
javelin = 77
|
|
178
|
+
firepath = 78
|
|
179
|
+
zsp = 79
|
|
180
|
+
mmix = 80
|
|
181
|
+
huany = 81
|
|
182
|
+
prism = 82
|
|
183
|
+
avr = 83
|
|
184
|
+
fr30 = 84
|
|
185
|
+
d10v = 85
|
|
186
|
+
d30v = 86
|
|
187
|
+
v850 = 87
|
|
188
|
+
m32r = 88
|
|
189
|
+
mn10300 = 89
|
|
190
|
+
mn10200 = 90
|
|
191
|
+
picojava = 91
|
|
192
|
+
openrisc = 92
|
|
193
|
+
arc_compact = 93
|
|
194
|
+
xtensa = 94
|
|
195
|
+
videocore = 95
|
|
196
|
+
tmm_gpp = 96
|
|
197
|
+
ns32k = 97
|
|
198
|
+
tpc = 98
|
|
199
|
+
snp1k = 99
|
|
200
|
+
st200 = 100
|
|
201
|
+
ip2k = 101
|
|
202
|
+
max = 102
|
|
203
|
+
compact_risc = 103
|
|
204
|
+
f2mc16 = 104
|
|
205
|
+
msp430 = 105
|
|
206
|
+
blackfin = 106
|
|
207
|
+
se_c33 = 107
|
|
208
|
+
sep = 108
|
|
209
|
+
arca = 109
|
|
210
|
+
unicore = 110
|
|
211
|
+
excess = 111
|
|
212
|
+
dxp = 112
|
|
213
|
+
altera_nios2 = 113
|
|
214
|
+
crx = 114
|
|
215
|
+
xgate = 115
|
|
216
|
+
c166 = 116
|
|
217
|
+
m16c = 117
|
|
218
|
+
dspic30f = 118
|
|
219
|
+
freescale_ce = 119
|
|
220
|
+
m32c = 120
|
|
221
|
+
tsk3000 = 131
|
|
222
|
+
rs08 = 132
|
|
223
|
+
sharc = 133
|
|
224
|
+
ecog2 = 134
|
|
225
|
+
score7 = 135
|
|
226
|
+
dsp24 = 136
|
|
227
|
+
videocore3 = 137
|
|
228
|
+
latticemico32 = 138
|
|
229
|
+
se_c17 = 139
|
|
230
|
+
ti_c6000 = 140
|
|
231
|
+
ti_c2000 = 141
|
|
232
|
+
ti_c5500 = 142
|
|
233
|
+
ti_arp32 = 143
|
|
234
|
+
ti_pru = 144
|
|
235
|
+
mmdsp_plus = 160
|
|
236
|
+
cypress_m8c = 161
|
|
237
|
+
r32c = 162
|
|
238
|
+
trimedia = 163
|
|
239
|
+
qdsp6 = 164
|
|
240
|
+
i8051 = 165
|
|
241
|
+
stxp7x = 166
|
|
242
|
+
nds32 = 167
|
|
243
|
+
ecog1x = 168
|
|
244
|
+
maxq30 = 169
|
|
245
|
+
ximo16 = 170
|
|
246
|
+
manik = 171
|
|
247
|
+
craynv2 = 172
|
|
248
|
+
rx = 173
|
|
249
|
+
metag = 174
|
|
250
|
+
mcst_elbrus = 175
|
|
251
|
+
ecog16 = 176
|
|
252
|
+
cr16 = 177
|
|
253
|
+
etpu = 178
|
|
254
|
+
sle9x = 179
|
|
255
|
+
l10m = 180
|
|
256
|
+
k10m = 181
|
|
257
|
+
aarch64 = 183
|
|
258
|
+
avr32 = 185
|
|
259
|
+
stm8 = 186
|
|
260
|
+
tile64 = 187
|
|
261
|
+
tilepro = 188
|
|
262
|
+
microblaze = 189
|
|
263
|
+
cuda = 190
|
|
264
|
+
tilegx = 191
|
|
265
|
+
cloudshield = 192
|
|
266
|
+
corea_1st = 193
|
|
267
|
+
corea_2nd = 194
|
|
268
|
+
arcv2 = 195
|
|
269
|
+
open8 = 196
|
|
270
|
+
rl78 = 197
|
|
271
|
+
videocore5 = 198
|
|
272
|
+
renesas_78kor = 199
|
|
273
|
+
freescale_56800ex = 200
|
|
274
|
+
ba1 = 201
|
|
275
|
+
ba2 = 202
|
|
276
|
+
xcore = 203
|
|
277
|
+
mchp_pic = 204
|
|
278
|
+
intelgt = 205
|
|
279
|
+
intel206 = 206
|
|
280
|
+
intel207 = 207
|
|
281
|
+
intel208 = 208
|
|
282
|
+
intel209 = 209
|
|
283
|
+
km32 = 210
|
|
284
|
+
kmx32 = 211
|
|
285
|
+
kmx16 = 212
|
|
286
|
+
kmx8 = 213
|
|
287
|
+
kvarc = 214
|
|
288
|
+
cdp = 215
|
|
289
|
+
coge = 216
|
|
290
|
+
cool = 217
|
|
291
|
+
norc = 218
|
|
292
|
+
csr_kalimba = 219
|
|
293
|
+
z80 = 220
|
|
294
|
+
visium = 221
|
|
295
|
+
ft32 = 222
|
|
296
|
+
moxie = 223
|
|
297
|
+
amd_gpu = 224
|
|
298
|
+
riscv = 243
|
|
299
|
+
lanai = 244
|
|
300
|
+
ceva = 245
|
|
301
|
+
ceva_x2 = 246
|
|
302
|
+
bpf = 247
|
|
303
|
+
graphcore_ipu = 248
|
|
304
|
+
img1 = 249
|
|
305
|
+
nfp = 250
|
|
306
|
+
ve = 251
|
|
307
|
+
csky = 252
|
|
308
|
+
arc_compact3_64 = 253
|
|
309
|
+
mcs6502 = 254
|
|
310
|
+
arc_compact3 = 255
|
|
311
|
+
kvx = 256
|
|
312
|
+
wdc65816 = 257
|
|
313
|
+
loongarch = 258
|
|
314
|
+
kf32 = 259
|
|
315
|
+
u16_u8core = 260
|
|
316
|
+
tachyum = 261
|
|
317
|
+
nxp_56800ef = 262
|
|
318
|
+
avr_old = 4183
|
|
319
|
+
msp430_old = 4185
|
|
320
|
+
adapteva_epiphany = 4643
|
|
321
|
+
mt = 9520
|
|
322
|
+
cygnus_fr30 = 13104
|
|
323
|
+
webassembly = 16727
|
|
324
|
+
xc16x = 18056
|
|
325
|
+
s12z = 19951
|
|
326
|
+
cygnus_frv = 21569
|
|
327
|
+
dlx = 23205
|
|
328
|
+
cygnus_d10v = 30288
|
|
329
|
+
cygnus_d30v = 30326
|
|
330
|
+
ip2k_old = 33303
|
|
331
|
+
cygnus_powerpc = 36901
|
|
332
|
+
alpha = 36902
|
|
333
|
+
cygnus_m32r = 36929
|
|
334
|
+
cygnus_v850 = 36992
|
|
335
|
+
s390_old = 41872
|
|
336
|
+
xtensa_old = 43975
|
|
337
|
+
xstormy16 = 44357
|
|
338
|
+
microblaze_old = 47787
|
|
339
|
+
cygnus_mn10300 = 48879
|
|
340
|
+
cygnus_mn10200 = 57005
|
|
341
|
+
cygnus_mep = 61453
|
|
342
|
+
m32c_old = 65200
|
|
343
|
+
iq2000 = 65210
|
|
344
|
+
nios32 = 65211
|
|
345
|
+
moxie_old = 65261
|
|
346
|
+
|
|
347
|
+
class SymbolType(Enum):
|
|
348
|
+
no_type = 0
|
|
349
|
+
object = 1
|
|
350
|
+
func = 2
|
|
351
|
+
section = 3
|
|
352
|
+
file = 4
|
|
353
|
+
common = 5
|
|
354
|
+
tls = 6
|
|
355
|
+
relc = 8
|
|
356
|
+
srelc = 9
|
|
357
|
+
gnu_ifunc = 10
|
|
358
|
+
os11 = 11
|
|
359
|
+
os12 = 12
|
|
360
|
+
proc13 = 13
|
|
361
|
+
proc14 = 14
|
|
362
|
+
proc15 = 15
|
|
363
|
+
|
|
364
|
+
class DynamicArrayTags(Enum):
|
|
365
|
+
null = 0
|
|
366
|
+
needed = 1
|
|
367
|
+
pltrelsz = 2
|
|
368
|
+
pltgot = 3
|
|
369
|
+
hash = 4
|
|
370
|
+
strtab = 5
|
|
371
|
+
symtab = 6
|
|
372
|
+
rela = 7
|
|
373
|
+
relasz = 8
|
|
374
|
+
relaent = 9
|
|
375
|
+
strsz = 10
|
|
376
|
+
syment = 11
|
|
377
|
+
init = 12
|
|
378
|
+
fini = 13
|
|
379
|
+
soname = 14
|
|
380
|
+
rpath = 15
|
|
381
|
+
symbolic = 16
|
|
382
|
+
rel = 17
|
|
383
|
+
relsz = 18
|
|
384
|
+
relent = 19
|
|
385
|
+
pltrel = 20
|
|
386
|
+
debug = 21
|
|
387
|
+
textrel = 22
|
|
388
|
+
jmprel = 23
|
|
389
|
+
bind_now = 24
|
|
390
|
+
init_array = 25
|
|
391
|
+
fini_array = 26
|
|
392
|
+
init_arraysz = 27
|
|
393
|
+
fini_arraysz = 28
|
|
394
|
+
runpath = 29
|
|
395
|
+
flags = 30
|
|
396
|
+
preinit_array = 32
|
|
397
|
+
preinit_arraysz = 33
|
|
398
|
+
symtab_shndx = 34
|
|
399
|
+
relrsz = 35
|
|
400
|
+
relr = 36
|
|
401
|
+
relrent = 37
|
|
402
|
+
deprecated_sparc_register = 117440513
|
|
403
|
+
sunw_auxiliary = 1610612749
|
|
404
|
+
sunw_rtldinf = 1610612750
|
|
405
|
+
sunw_filter = 1610612751
|
|
406
|
+
sunw_cap = 1610612752
|
|
407
|
+
sunw_symtab = 1610612753
|
|
408
|
+
sunw_symsz = 1610612754
|
|
409
|
+
sunw_sortent = 1610612755
|
|
410
|
+
sunw_symsort = 1610612756
|
|
411
|
+
sunw_symsortsz = 1610612757
|
|
412
|
+
sunw_tlssort = 1610612758
|
|
413
|
+
sunw_tlssortsz = 1610612759
|
|
414
|
+
sunw_capinfo = 1610612760
|
|
415
|
+
sunw_strpad = 1610612761
|
|
416
|
+
sunw_capchain = 1610612762
|
|
417
|
+
sunw_ldmach = 1610612763
|
|
418
|
+
sunw_symtab_shndx = 1610612764
|
|
419
|
+
sunw_capchainent = 1610612765
|
|
420
|
+
sunw_deferred = 1610612766
|
|
421
|
+
sunw_capchainsz = 1610612767
|
|
422
|
+
sunw_phname = 1610612768
|
|
423
|
+
sunw_parent = 1610612769
|
|
424
|
+
sunw_sx_aslr = 1610612771
|
|
425
|
+
sunw_relax = 1610612773
|
|
426
|
+
sunw_kmod = 1610612775
|
|
427
|
+
sunw_sx_nxheap = 1610612777
|
|
428
|
+
sunw_sx_nxstack = 1610612779
|
|
429
|
+
sunw_sx_adiheap = 1610612781
|
|
430
|
+
sunw_sx_adistack = 1610612783
|
|
431
|
+
sunw_sx_ssbd = 1610612785
|
|
432
|
+
sunw_symnsort = 1610612786
|
|
433
|
+
sunw_symnsortsz = 1610612787
|
|
434
|
+
gnu_flags_1 = 1879047668
|
|
435
|
+
gnu_prelinked = 1879047669
|
|
436
|
+
gnu_conflictsz = 1879047670
|
|
437
|
+
gnu_liblistsz = 1879047671
|
|
438
|
+
checksum = 1879047672
|
|
439
|
+
pltpadsz = 1879047673
|
|
440
|
+
moveent = 1879047674
|
|
441
|
+
movesz = 1879047675
|
|
442
|
+
feature_1 = 1879047676
|
|
443
|
+
posflag_1 = 1879047677
|
|
444
|
+
syminsz = 1879047678
|
|
445
|
+
syminent = 1879047679
|
|
446
|
+
gnu_hash = 1879047925
|
|
447
|
+
tlsdesc_plt = 1879047926
|
|
448
|
+
tlsdesc_got = 1879047927
|
|
449
|
+
gnu_conflict = 1879047928
|
|
450
|
+
gnu_liblist = 1879047929
|
|
451
|
+
config = 1879047930
|
|
452
|
+
depaudit = 1879047931
|
|
453
|
+
audit = 1879047932
|
|
454
|
+
pltpad = 1879047933
|
|
455
|
+
movetab = 1879047934
|
|
456
|
+
syminfo = 1879047935
|
|
457
|
+
versym = 1879048176
|
|
458
|
+
relacount = 1879048185
|
|
459
|
+
relcount = 1879048186
|
|
460
|
+
flags_1 = 1879048187
|
|
461
|
+
verdef = 1879048188
|
|
462
|
+
verdefnum = 1879048189
|
|
463
|
+
verneed = 1879048190
|
|
464
|
+
verneednum = 1879048191
|
|
465
|
+
sparc_register = 1879048193
|
|
466
|
+
auxiliary = 2147483645
|
|
467
|
+
used = 2147483646
|
|
468
|
+
filter = 2147483647
|
|
469
|
+
|
|
470
|
+
class Bits(Enum):
|
|
471
|
+
b32 = 1
|
|
472
|
+
b64 = 2
|
|
473
|
+
|
|
474
|
+
class PhType(Enum):
|
|
475
|
+
null_type = 0
|
|
476
|
+
load = 1
|
|
477
|
+
dynamic = 2
|
|
478
|
+
interp = 3
|
|
479
|
+
note = 4
|
|
480
|
+
shlib = 5
|
|
481
|
+
phdr = 6
|
|
482
|
+
tls = 7
|
|
483
|
+
gnu_eh_frame = 1685382480
|
|
484
|
+
gnu_stack = 1685382481
|
|
485
|
+
gnu_relro = 1685382482
|
|
486
|
+
gnu_property = 1685382483
|
|
487
|
+
pax_flags = 1694766464
|
|
488
|
+
arm_exidx = 1879048193
|
|
489
|
+
|
|
490
|
+
class ObjType(Enum):
|
|
491
|
+
no_file_type = 0
|
|
492
|
+
relocatable = 1
|
|
493
|
+
executable = 2
|
|
494
|
+
shared = 3
|
|
495
|
+
core = 4
|
|
496
|
+
|
|
497
|
+
class SectionHeaderIdxSpecial(Enum):
|
|
498
|
+
undefined = 0
|
|
499
|
+
before = 65280
|
|
500
|
+
after = 65281
|
|
501
|
+
amd64_lcommon = 65282
|
|
502
|
+
sunw_ignore = 65343
|
|
503
|
+
abs = 65521
|
|
504
|
+
common = 65522
|
|
505
|
+
xindex = 65535
|
|
506
|
+
SEQ_FIELDS = ["magic", "bits", "endian", "ei_version", "abi", "abi_version", "pad", "header"]
|
|
507
|
+
def __init__(self, _io, _parent=None, _root=None):
|
|
508
|
+
self._io = _io
|
|
509
|
+
self._parent = _parent
|
|
510
|
+
self._root = _root if _root else self
|
|
511
|
+
self._debug = collections.defaultdict(dict)
|
|
512
|
+
|
|
513
|
+
def _read(self):
|
|
514
|
+
self._debug['magic']['start'] = self._io.pos()
|
|
515
|
+
self.magic = self._io.read_bytes(4)
|
|
516
|
+
self._debug['magic']['end'] = self._io.pos()
|
|
517
|
+
if not self.magic == b"\x7F\x45\x4C\x46":
|
|
518
|
+
raise kaitaistruct.ValidationNotEqualError(b"\x7F\x45\x4C\x46", self.magic, self._io, u"/seq/0")
|
|
519
|
+
self._debug['bits']['start'] = self._io.pos()
|
|
520
|
+
self.bits = KaitaiStream.resolve_enum(Elf.Bits, self._io.read_u1())
|
|
521
|
+
self._debug['bits']['end'] = self._io.pos()
|
|
522
|
+
self._debug['endian']['start'] = self._io.pos()
|
|
523
|
+
self.endian = KaitaiStream.resolve_enum(Elf.Endian, self._io.read_u1())
|
|
524
|
+
self._debug['endian']['end'] = self._io.pos()
|
|
525
|
+
self._debug['ei_version']['start'] = self._io.pos()
|
|
526
|
+
self.ei_version = self._io.read_u1()
|
|
527
|
+
self._debug['ei_version']['end'] = self._io.pos()
|
|
528
|
+
if not self.ei_version == 1:
|
|
529
|
+
raise kaitaistruct.ValidationNotEqualError(1, self.ei_version, self._io, u"/seq/3")
|
|
530
|
+
self._debug['abi']['start'] = self._io.pos()
|
|
531
|
+
self.abi = KaitaiStream.resolve_enum(Elf.OsAbi, self._io.read_u1())
|
|
532
|
+
self._debug['abi']['end'] = self._io.pos()
|
|
533
|
+
self._debug['abi_version']['start'] = self._io.pos()
|
|
534
|
+
self.abi_version = self._io.read_u1()
|
|
535
|
+
self._debug['abi_version']['end'] = self._io.pos()
|
|
536
|
+
self._debug['pad']['start'] = self._io.pos()
|
|
537
|
+
self.pad = self._io.read_bytes(7)
|
|
538
|
+
self._debug['pad']['end'] = self._io.pos()
|
|
539
|
+
if not self.pad == b"\x00\x00\x00\x00\x00\x00\x00":
|
|
540
|
+
raise kaitaistruct.ValidationNotEqualError(b"\x00\x00\x00\x00\x00\x00\x00", self.pad, self._io, u"/seq/6")
|
|
541
|
+
self._debug['header']['start'] = self._io.pos()
|
|
542
|
+
self.header = Elf.EndianElf(self._io, self, self._root)
|
|
543
|
+
self.header._read()
|
|
544
|
+
self._debug['header']['end'] = self._io.pos()
|
|
545
|
+
|
|
546
|
+
class EndianElf(KaitaiStruct):
|
|
547
|
+
SEQ_FIELDS = ["e_type", "machine", "e_version", "entry_point", "program_header_offset", "section_header_offset", "flags", "e_ehsize", "program_header_entry_size", "qty_program_header", "section_header_entry_size", "qty_section_header", "section_names_idx"]
|
|
548
|
+
def __init__(self, _io, _parent=None, _root=None):
|
|
549
|
+
self._io = _io
|
|
550
|
+
self._parent = _parent
|
|
551
|
+
self._root = _root if _root else self
|
|
552
|
+
self._debug = collections.defaultdict(dict)
|
|
553
|
+
|
|
554
|
+
def _read(self):
|
|
555
|
+
_on = self._root.endian
|
|
556
|
+
if _on == Elf.Endian.le:
|
|
557
|
+
self._is_le = True
|
|
558
|
+
elif _on == Elf.Endian.be:
|
|
559
|
+
self._is_le = False
|
|
560
|
+
if not hasattr(self, '_is_le'):
|
|
561
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf")
|
|
562
|
+
elif self._is_le == True:
|
|
563
|
+
self._read_le()
|
|
564
|
+
elif self._is_le == False:
|
|
565
|
+
self._read_be()
|
|
566
|
+
|
|
567
|
+
def _read_le(self):
|
|
568
|
+
self._debug['e_type']['start'] = self._io.pos()
|
|
569
|
+
self.e_type = KaitaiStream.resolve_enum(Elf.ObjType, self._io.read_u2le())
|
|
570
|
+
self._debug['e_type']['end'] = self._io.pos()
|
|
571
|
+
self._debug['machine']['start'] = self._io.pos()
|
|
572
|
+
self.machine = KaitaiStream.resolve_enum(Elf.Machine, self._io.read_u2le())
|
|
573
|
+
self._debug['machine']['end'] = self._io.pos()
|
|
574
|
+
self._debug['e_version']['start'] = self._io.pos()
|
|
575
|
+
self.e_version = self._io.read_u4le()
|
|
576
|
+
self._debug['e_version']['end'] = self._io.pos()
|
|
577
|
+
self._debug['entry_point']['start'] = self._io.pos()
|
|
578
|
+
_on = self._root.bits
|
|
579
|
+
if _on == Elf.Bits.b32:
|
|
580
|
+
self.entry_point = self._io.read_u4le()
|
|
581
|
+
elif _on == Elf.Bits.b64:
|
|
582
|
+
self.entry_point = self._io.read_u8le()
|
|
583
|
+
self._debug['entry_point']['end'] = self._io.pos()
|
|
584
|
+
self._debug['program_header_offset']['start'] = self._io.pos()
|
|
585
|
+
_on = self._root.bits
|
|
586
|
+
if _on == Elf.Bits.b32:
|
|
587
|
+
self.program_header_offset = self._io.read_u4le()
|
|
588
|
+
elif _on == Elf.Bits.b64:
|
|
589
|
+
self.program_header_offset = self._io.read_u8le()
|
|
590
|
+
self._debug['program_header_offset']['end'] = self._io.pos()
|
|
591
|
+
self._debug['section_header_offset']['start'] = self._io.pos()
|
|
592
|
+
_on = self._root.bits
|
|
593
|
+
if _on == Elf.Bits.b32:
|
|
594
|
+
self.section_header_offset = self._io.read_u4le()
|
|
595
|
+
elif _on == Elf.Bits.b64:
|
|
596
|
+
self.section_header_offset = self._io.read_u8le()
|
|
597
|
+
self._debug['section_header_offset']['end'] = self._io.pos()
|
|
598
|
+
self._debug['flags']['start'] = self._io.pos()
|
|
599
|
+
self.flags = self._io.read_bytes(4)
|
|
600
|
+
self._debug['flags']['end'] = self._io.pos()
|
|
601
|
+
self._debug['e_ehsize']['start'] = self._io.pos()
|
|
602
|
+
self.e_ehsize = self._io.read_u2le()
|
|
603
|
+
self._debug['e_ehsize']['end'] = self._io.pos()
|
|
604
|
+
self._debug['program_header_entry_size']['start'] = self._io.pos()
|
|
605
|
+
self.program_header_entry_size = self._io.read_u2le()
|
|
606
|
+
self._debug['program_header_entry_size']['end'] = self._io.pos()
|
|
607
|
+
self._debug['qty_program_header']['start'] = self._io.pos()
|
|
608
|
+
self.qty_program_header = self._io.read_u2le()
|
|
609
|
+
self._debug['qty_program_header']['end'] = self._io.pos()
|
|
610
|
+
self._debug['section_header_entry_size']['start'] = self._io.pos()
|
|
611
|
+
self.section_header_entry_size = self._io.read_u2le()
|
|
612
|
+
self._debug['section_header_entry_size']['end'] = self._io.pos()
|
|
613
|
+
self._debug['qty_section_header']['start'] = self._io.pos()
|
|
614
|
+
self.qty_section_header = self._io.read_u2le()
|
|
615
|
+
self._debug['qty_section_header']['end'] = self._io.pos()
|
|
616
|
+
self._debug['section_names_idx']['start'] = self._io.pos()
|
|
617
|
+
self.section_names_idx = self._io.read_u2le()
|
|
618
|
+
self._debug['section_names_idx']['end'] = self._io.pos()
|
|
619
|
+
|
|
620
|
+
def _read_be(self):
|
|
621
|
+
self._debug['e_type']['start'] = self._io.pos()
|
|
622
|
+
self.e_type = KaitaiStream.resolve_enum(Elf.ObjType, self._io.read_u2be())
|
|
623
|
+
self._debug['e_type']['end'] = self._io.pos()
|
|
624
|
+
self._debug['machine']['start'] = self._io.pos()
|
|
625
|
+
self.machine = KaitaiStream.resolve_enum(Elf.Machine, self._io.read_u2be())
|
|
626
|
+
self._debug['machine']['end'] = self._io.pos()
|
|
627
|
+
self._debug['e_version']['start'] = self._io.pos()
|
|
628
|
+
self.e_version = self._io.read_u4be()
|
|
629
|
+
self._debug['e_version']['end'] = self._io.pos()
|
|
630
|
+
self._debug['entry_point']['start'] = self._io.pos()
|
|
631
|
+
_on = self._root.bits
|
|
632
|
+
if _on == Elf.Bits.b32:
|
|
633
|
+
self.entry_point = self._io.read_u4be()
|
|
634
|
+
elif _on == Elf.Bits.b64:
|
|
635
|
+
self.entry_point = self._io.read_u8be()
|
|
636
|
+
self._debug['entry_point']['end'] = self._io.pos()
|
|
637
|
+
self._debug['program_header_offset']['start'] = self._io.pos()
|
|
638
|
+
_on = self._root.bits
|
|
639
|
+
if _on == Elf.Bits.b32:
|
|
640
|
+
self.program_header_offset = self._io.read_u4be()
|
|
641
|
+
elif _on == Elf.Bits.b64:
|
|
642
|
+
self.program_header_offset = self._io.read_u8be()
|
|
643
|
+
self._debug['program_header_offset']['end'] = self._io.pos()
|
|
644
|
+
self._debug['section_header_offset']['start'] = self._io.pos()
|
|
645
|
+
_on = self._root.bits
|
|
646
|
+
if _on == Elf.Bits.b32:
|
|
647
|
+
self.section_header_offset = self._io.read_u4be()
|
|
648
|
+
elif _on == Elf.Bits.b64:
|
|
649
|
+
self.section_header_offset = self._io.read_u8be()
|
|
650
|
+
self._debug['section_header_offset']['end'] = self._io.pos()
|
|
651
|
+
self._debug['flags']['start'] = self._io.pos()
|
|
652
|
+
self.flags = self._io.read_bytes(4)
|
|
653
|
+
self._debug['flags']['end'] = self._io.pos()
|
|
654
|
+
self._debug['e_ehsize']['start'] = self._io.pos()
|
|
655
|
+
self.e_ehsize = self._io.read_u2be()
|
|
656
|
+
self._debug['e_ehsize']['end'] = self._io.pos()
|
|
657
|
+
self._debug['program_header_entry_size']['start'] = self._io.pos()
|
|
658
|
+
self.program_header_entry_size = self._io.read_u2be()
|
|
659
|
+
self._debug['program_header_entry_size']['end'] = self._io.pos()
|
|
660
|
+
self._debug['qty_program_header']['start'] = self._io.pos()
|
|
661
|
+
self.qty_program_header = self._io.read_u2be()
|
|
662
|
+
self._debug['qty_program_header']['end'] = self._io.pos()
|
|
663
|
+
self._debug['section_header_entry_size']['start'] = self._io.pos()
|
|
664
|
+
self.section_header_entry_size = self._io.read_u2be()
|
|
665
|
+
self._debug['section_header_entry_size']['end'] = self._io.pos()
|
|
666
|
+
self._debug['qty_section_header']['start'] = self._io.pos()
|
|
667
|
+
self.qty_section_header = self._io.read_u2be()
|
|
668
|
+
self._debug['qty_section_header']['end'] = self._io.pos()
|
|
669
|
+
self._debug['section_names_idx']['start'] = self._io.pos()
|
|
670
|
+
self.section_names_idx = self._io.read_u2be()
|
|
671
|
+
self._debug['section_names_idx']['end'] = self._io.pos()
|
|
672
|
+
|
|
673
|
+
class NoteSection(KaitaiStruct):
|
|
674
|
+
SEQ_FIELDS = ["entries"]
|
|
675
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
676
|
+
self._io = _io
|
|
677
|
+
self._parent = _parent
|
|
678
|
+
self._root = _root if _root else self
|
|
679
|
+
self._is_le = _is_le
|
|
680
|
+
self._debug = collections.defaultdict(dict)
|
|
681
|
+
|
|
682
|
+
def _read(self):
|
|
683
|
+
if not hasattr(self, '_is_le'):
|
|
684
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/note_section")
|
|
685
|
+
elif self._is_le == True:
|
|
686
|
+
self._read_le()
|
|
687
|
+
elif self._is_le == False:
|
|
688
|
+
self._read_be()
|
|
689
|
+
|
|
690
|
+
def _read_le(self):
|
|
691
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
692
|
+
self.entries = []
|
|
693
|
+
i = 0
|
|
694
|
+
while not self._io.is_eof():
|
|
695
|
+
if not 'arr' in self._debug['entries']:
|
|
696
|
+
self._debug['entries']['arr'] = []
|
|
697
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
698
|
+
_t_entries = Elf.EndianElf.NoteSectionEntry(self._io, self, self._root, self._is_le)
|
|
699
|
+
_t_entries._read()
|
|
700
|
+
self.entries.append(_t_entries)
|
|
701
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
702
|
+
i += 1
|
|
703
|
+
|
|
704
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
705
|
+
|
|
706
|
+
def _read_be(self):
|
|
707
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
708
|
+
self.entries = []
|
|
709
|
+
i = 0
|
|
710
|
+
while not self._io.is_eof():
|
|
711
|
+
if not 'arr' in self._debug['entries']:
|
|
712
|
+
self._debug['entries']['arr'] = []
|
|
713
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
714
|
+
_t_entries = Elf.EndianElf.NoteSectionEntry(self._io, self, self._root, self._is_le)
|
|
715
|
+
_t_entries._read()
|
|
716
|
+
self.entries.append(_t_entries)
|
|
717
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
718
|
+
i += 1
|
|
719
|
+
|
|
720
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
class ProgramHeader(KaitaiStruct):
|
|
724
|
+
SEQ_FIELDS = ["type", "flags64", "offset", "vaddr", "paddr", "filesz", "memsz", "flags32", "align"]
|
|
725
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
726
|
+
self._io = _io
|
|
727
|
+
self._parent = _parent
|
|
728
|
+
self._root = _root if _root else self
|
|
729
|
+
self._is_le = _is_le
|
|
730
|
+
self._debug = collections.defaultdict(dict)
|
|
731
|
+
|
|
732
|
+
def _read(self):
|
|
733
|
+
if not hasattr(self, '_is_le'):
|
|
734
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/program_header")
|
|
735
|
+
elif self._is_le == True:
|
|
736
|
+
self._read_le()
|
|
737
|
+
elif self._is_le == False:
|
|
738
|
+
self._read_be()
|
|
739
|
+
|
|
740
|
+
def _read_le(self):
|
|
741
|
+
self._debug['type']['start'] = self._io.pos()
|
|
742
|
+
self.type = KaitaiStream.resolve_enum(Elf.PhType, self._io.read_u4le())
|
|
743
|
+
self._debug['type']['end'] = self._io.pos()
|
|
744
|
+
if self._root.bits == Elf.Bits.b64:
|
|
745
|
+
self._debug['flags64']['start'] = self._io.pos()
|
|
746
|
+
self.flags64 = self._io.read_u4le()
|
|
747
|
+
self._debug['flags64']['end'] = self._io.pos()
|
|
748
|
+
|
|
749
|
+
self._debug['offset']['start'] = self._io.pos()
|
|
750
|
+
_on = self._root.bits
|
|
751
|
+
if _on == Elf.Bits.b32:
|
|
752
|
+
self.offset = self._io.read_u4le()
|
|
753
|
+
elif _on == Elf.Bits.b64:
|
|
754
|
+
self.offset = self._io.read_u8le()
|
|
755
|
+
self._debug['offset']['end'] = self._io.pos()
|
|
756
|
+
self._debug['vaddr']['start'] = self._io.pos()
|
|
757
|
+
_on = self._root.bits
|
|
758
|
+
if _on == Elf.Bits.b32:
|
|
759
|
+
self.vaddr = self._io.read_u4le()
|
|
760
|
+
elif _on == Elf.Bits.b64:
|
|
761
|
+
self.vaddr = self._io.read_u8le()
|
|
762
|
+
self._debug['vaddr']['end'] = self._io.pos()
|
|
763
|
+
self._debug['paddr']['start'] = self._io.pos()
|
|
764
|
+
_on = self._root.bits
|
|
765
|
+
if _on == Elf.Bits.b32:
|
|
766
|
+
self.paddr = self._io.read_u4le()
|
|
767
|
+
elif _on == Elf.Bits.b64:
|
|
768
|
+
self.paddr = self._io.read_u8le()
|
|
769
|
+
self._debug['paddr']['end'] = self._io.pos()
|
|
770
|
+
self._debug['filesz']['start'] = self._io.pos()
|
|
771
|
+
_on = self._root.bits
|
|
772
|
+
if _on == Elf.Bits.b32:
|
|
773
|
+
self.filesz = self._io.read_u4le()
|
|
774
|
+
elif _on == Elf.Bits.b64:
|
|
775
|
+
self.filesz = self._io.read_u8le()
|
|
776
|
+
self._debug['filesz']['end'] = self._io.pos()
|
|
777
|
+
self._debug['memsz']['start'] = self._io.pos()
|
|
778
|
+
_on = self._root.bits
|
|
779
|
+
if _on == Elf.Bits.b32:
|
|
780
|
+
self.memsz = self._io.read_u4le()
|
|
781
|
+
elif _on == Elf.Bits.b64:
|
|
782
|
+
self.memsz = self._io.read_u8le()
|
|
783
|
+
self._debug['memsz']['end'] = self._io.pos()
|
|
784
|
+
if self._root.bits == Elf.Bits.b32:
|
|
785
|
+
self._debug['flags32']['start'] = self._io.pos()
|
|
786
|
+
self.flags32 = self._io.read_u4le()
|
|
787
|
+
self._debug['flags32']['end'] = self._io.pos()
|
|
788
|
+
|
|
789
|
+
self._debug['align']['start'] = self._io.pos()
|
|
790
|
+
_on = self._root.bits
|
|
791
|
+
if _on == Elf.Bits.b32:
|
|
792
|
+
self.align = self._io.read_u4le()
|
|
793
|
+
elif _on == Elf.Bits.b64:
|
|
794
|
+
self.align = self._io.read_u8le()
|
|
795
|
+
self._debug['align']['end'] = self._io.pos()
|
|
796
|
+
|
|
797
|
+
def _read_be(self):
|
|
798
|
+
self._debug['type']['start'] = self._io.pos()
|
|
799
|
+
self.type = KaitaiStream.resolve_enum(Elf.PhType, self._io.read_u4be())
|
|
800
|
+
self._debug['type']['end'] = self._io.pos()
|
|
801
|
+
if self._root.bits == Elf.Bits.b64:
|
|
802
|
+
self._debug['flags64']['start'] = self._io.pos()
|
|
803
|
+
self.flags64 = self._io.read_u4be()
|
|
804
|
+
self._debug['flags64']['end'] = self._io.pos()
|
|
805
|
+
|
|
806
|
+
self._debug['offset']['start'] = self._io.pos()
|
|
807
|
+
_on = self._root.bits
|
|
808
|
+
if _on == Elf.Bits.b32:
|
|
809
|
+
self.offset = self._io.read_u4be()
|
|
810
|
+
elif _on == Elf.Bits.b64:
|
|
811
|
+
self.offset = self._io.read_u8be()
|
|
812
|
+
self._debug['offset']['end'] = self._io.pos()
|
|
813
|
+
self._debug['vaddr']['start'] = self._io.pos()
|
|
814
|
+
_on = self._root.bits
|
|
815
|
+
if _on == Elf.Bits.b32:
|
|
816
|
+
self.vaddr = self._io.read_u4be()
|
|
817
|
+
elif _on == Elf.Bits.b64:
|
|
818
|
+
self.vaddr = self._io.read_u8be()
|
|
819
|
+
self._debug['vaddr']['end'] = self._io.pos()
|
|
820
|
+
self._debug['paddr']['start'] = self._io.pos()
|
|
821
|
+
_on = self._root.bits
|
|
822
|
+
if _on == Elf.Bits.b32:
|
|
823
|
+
self.paddr = self._io.read_u4be()
|
|
824
|
+
elif _on == Elf.Bits.b64:
|
|
825
|
+
self.paddr = self._io.read_u8be()
|
|
826
|
+
self._debug['paddr']['end'] = self._io.pos()
|
|
827
|
+
self._debug['filesz']['start'] = self._io.pos()
|
|
828
|
+
_on = self._root.bits
|
|
829
|
+
if _on == Elf.Bits.b32:
|
|
830
|
+
self.filesz = self._io.read_u4be()
|
|
831
|
+
elif _on == Elf.Bits.b64:
|
|
832
|
+
self.filesz = self._io.read_u8be()
|
|
833
|
+
self._debug['filesz']['end'] = self._io.pos()
|
|
834
|
+
self._debug['memsz']['start'] = self._io.pos()
|
|
835
|
+
_on = self._root.bits
|
|
836
|
+
if _on == Elf.Bits.b32:
|
|
837
|
+
self.memsz = self._io.read_u4be()
|
|
838
|
+
elif _on == Elf.Bits.b64:
|
|
839
|
+
self.memsz = self._io.read_u8be()
|
|
840
|
+
self._debug['memsz']['end'] = self._io.pos()
|
|
841
|
+
if self._root.bits == Elf.Bits.b32:
|
|
842
|
+
self._debug['flags32']['start'] = self._io.pos()
|
|
843
|
+
self.flags32 = self._io.read_u4be()
|
|
844
|
+
self._debug['flags32']['end'] = self._io.pos()
|
|
845
|
+
|
|
846
|
+
self._debug['align']['start'] = self._io.pos()
|
|
847
|
+
_on = self._root.bits
|
|
848
|
+
if _on == Elf.Bits.b32:
|
|
849
|
+
self.align = self._io.read_u4be()
|
|
850
|
+
elif _on == Elf.Bits.b64:
|
|
851
|
+
self.align = self._io.read_u8be()
|
|
852
|
+
self._debug['align']['end'] = self._io.pos()
|
|
853
|
+
|
|
854
|
+
@property
|
|
855
|
+
def flags_obj(self):
|
|
856
|
+
if hasattr(self, '_m_flags_obj'):
|
|
857
|
+
return self._m_flags_obj if hasattr(self, '_m_flags_obj') else None
|
|
858
|
+
|
|
859
|
+
self._debug['_m_flags_obj']['start'] = self._io.pos()
|
|
860
|
+
if self._is_le:
|
|
861
|
+
_on = self._root.bits
|
|
862
|
+
if _on == Elf.Bits.b32:
|
|
863
|
+
self._m_flags_obj = Elf.PhdrTypeFlags(self.flags32, self._io, self, self._root)
|
|
864
|
+
self._m_flags_obj._read()
|
|
865
|
+
elif _on == Elf.Bits.b64:
|
|
866
|
+
self._m_flags_obj = Elf.PhdrTypeFlags(self.flags64, self._io, self, self._root)
|
|
867
|
+
self._m_flags_obj._read()
|
|
868
|
+
else:
|
|
869
|
+
_on = self._root.bits
|
|
870
|
+
if _on == Elf.Bits.b32:
|
|
871
|
+
self._m_flags_obj = Elf.PhdrTypeFlags(self.flags32, self._io, self, self._root)
|
|
872
|
+
self._m_flags_obj._read()
|
|
873
|
+
elif _on == Elf.Bits.b64:
|
|
874
|
+
self._m_flags_obj = Elf.PhdrTypeFlags(self.flags64, self._io, self, self._root)
|
|
875
|
+
self._m_flags_obj._read()
|
|
876
|
+
self._debug['_m_flags_obj']['end'] = self._io.pos()
|
|
877
|
+
return self._m_flags_obj if hasattr(self, '_m_flags_obj') else None
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
class DynamicSectionEntry(KaitaiStruct):
|
|
881
|
+
"""
|
|
882
|
+
.. seealso::
|
|
883
|
+
Source - https://docs.oracle.com/en/operating-systems/solaris/oracle-solaris/11.4/linkers-libraries/dynamic-section.html
|
|
884
|
+
|
|
885
|
+
|
|
886
|
+
.. seealso::
|
|
887
|
+
Source - https://refspecs.linuxfoundation.org/elf/gabi4+/ch5.dynamic.html#dynamic_section
|
|
888
|
+
"""
|
|
889
|
+
SEQ_FIELDS = ["tag", "value_or_ptr"]
|
|
890
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
891
|
+
self._io = _io
|
|
892
|
+
self._parent = _parent
|
|
893
|
+
self._root = _root if _root else self
|
|
894
|
+
self._is_le = _is_le
|
|
895
|
+
self._debug = collections.defaultdict(dict)
|
|
896
|
+
|
|
897
|
+
def _read(self):
|
|
898
|
+
if not hasattr(self, '_is_le'):
|
|
899
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/dynamic_section_entry")
|
|
900
|
+
elif self._is_le == True:
|
|
901
|
+
self._read_le()
|
|
902
|
+
elif self._is_le == False:
|
|
903
|
+
self._read_be()
|
|
904
|
+
|
|
905
|
+
def _read_le(self):
|
|
906
|
+
self._debug['tag']['start'] = self._io.pos()
|
|
907
|
+
_on = self._root.bits
|
|
908
|
+
if _on == Elf.Bits.b32:
|
|
909
|
+
self.tag = self._io.read_u4le()
|
|
910
|
+
elif _on == Elf.Bits.b64:
|
|
911
|
+
self.tag = self._io.read_u8le()
|
|
912
|
+
self._debug['tag']['end'] = self._io.pos()
|
|
913
|
+
self._debug['value_or_ptr']['start'] = self._io.pos()
|
|
914
|
+
_on = self._root.bits
|
|
915
|
+
if _on == Elf.Bits.b32:
|
|
916
|
+
self.value_or_ptr = self._io.read_u4le()
|
|
917
|
+
elif _on == Elf.Bits.b64:
|
|
918
|
+
self.value_or_ptr = self._io.read_u8le()
|
|
919
|
+
self._debug['value_or_ptr']['end'] = self._io.pos()
|
|
920
|
+
|
|
921
|
+
def _read_be(self):
|
|
922
|
+
self._debug['tag']['start'] = self._io.pos()
|
|
923
|
+
_on = self._root.bits
|
|
924
|
+
if _on == Elf.Bits.b32:
|
|
925
|
+
self.tag = self._io.read_u4be()
|
|
926
|
+
elif _on == Elf.Bits.b64:
|
|
927
|
+
self.tag = self._io.read_u8be()
|
|
928
|
+
self._debug['tag']['end'] = self._io.pos()
|
|
929
|
+
self._debug['value_or_ptr']['start'] = self._io.pos()
|
|
930
|
+
_on = self._root.bits
|
|
931
|
+
if _on == Elf.Bits.b32:
|
|
932
|
+
self.value_or_ptr = self._io.read_u4be()
|
|
933
|
+
elif _on == Elf.Bits.b64:
|
|
934
|
+
self.value_or_ptr = self._io.read_u8be()
|
|
935
|
+
self._debug['value_or_ptr']['end'] = self._io.pos()
|
|
936
|
+
|
|
937
|
+
@property
|
|
938
|
+
def flag_1_values(self):
|
|
939
|
+
if hasattr(self, '_m_flag_1_values'):
|
|
940
|
+
return self._m_flag_1_values if hasattr(self, '_m_flag_1_values') else None
|
|
941
|
+
|
|
942
|
+
if self.tag_enum == Elf.DynamicArrayTags.flags_1:
|
|
943
|
+
self._debug['_m_flag_1_values']['start'] = self._io.pos()
|
|
944
|
+
if self._is_le:
|
|
945
|
+
self._m_flag_1_values = Elf.DtFlag1Values(self.value_or_ptr, self._io, self, self._root)
|
|
946
|
+
self._m_flag_1_values._read()
|
|
947
|
+
else:
|
|
948
|
+
self._m_flag_1_values = Elf.DtFlag1Values(self.value_or_ptr, self._io, self, self._root)
|
|
949
|
+
self._m_flag_1_values._read()
|
|
950
|
+
self._debug['_m_flag_1_values']['end'] = self._io.pos()
|
|
951
|
+
|
|
952
|
+
return self._m_flag_1_values if hasattr(self, '_m_flag_1_values') else None
|
|
953
|
+
|
|
954
|
+
@property
|
|
955
|
+
def value_str(self):
|
|
956
|
+
if hasattr(self, '_m_value_str'):
|
|
957
|
+
return self._m_value_str if hasattr(self, '_m_value_str') else None
|
|
958
|
+
|
|
959
|
+
if ((self.is_value_str) and (self._parent.is_string_table_linked)) :
|
|
960
|
+
io = self._parent._parent.linked_section.body._io
|
|
961
|
+
_pos = io.pos()
|
|
962
|
+
io.seek(self.value_or_ptr)
|
|
963
|
+
self._debug['_m_value_str']['start'] = io.pos()
|
|
964
|
+
if self._is_le:
|
|
965
|
+
self._m_value_str = (io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
|
|
966
|
+
else:
|
|
967
|
+
self._m_value_str = (io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
|
|
968
|
+
self._debug['_m_value_str']['end'] = io.pos()
|
|
969
|
+
io.seek(_pos)
|
|
970
|
+
|
|
971
|
+
return self._m_value_str if hasattr(self, '_m_value_str') else None
|
|
972
|
+
|
|
973
|
+
@property
|
|
974
|
+
def tag_enum(self):
|
|
975
|
+
if hasattr(self, '_m_tag_enum'):
|
|
976
|
+
return self._m_tag_enum if hasattr(self, '_m_tag_enum') else None
|
|
977
|
+
|
|
978
|
+
self._m_tag_enum = KaitaiStream.resolve_enum(Elf.DynamicArrayTags, self.tag)
|
|
979
|
+
return self._m_tag_enum if hasattr(self, '_m_tag_enum') else None
|
|
980
|
+
|
|
981
|
+
@property
|
|
982
|
+
def flag_values(self):
|
|
983
|
+
if hasattr(self, '_m_flag_values'):
|
|
984
|
+
return self._m_flag_values if hasattr(self, '_m_flag_values') else None
|
|
985
|
+
|
|
986
|
+
if self.tag_enum == Elf.DynamicArrayTags.flags:
|
|
987
|
+
self._debug['_m_flag_values']['start'] = self._io.pos()
|
|
988
|
+
if self._is_le:
|
|
989
|
+
self._m_flag_values = Elf.DtFlagValues(self.value_or_ptr, self._io, self, self._root)
|
|
990
|
+
self._m_flag_values._read()
|
|
991
|
+
else:
|
|
992
|
+
self._m_flag_values = Elf.DtFlagValues(self.value_or_ptr, self._io, self, self._root)
|
|
993
|
+
self._m_flag_values._read()
|
|
994
|
+
self._debug['_m_flag_values']['end'] = self._io.pos()
|
|
995
|
+
|
|
996
|
+
return self._m_flag_values if hasattr(self, '_m_flag_values') else None
|
|
997
|
+
|
|
998
|
+
@property
|
|
999
|
+
def is_value_str(self):
|
|
1000
|
+
if hasattr(self, '_m_is_value_str'):
|
|
1001
|
+
return self._m_is_value_str if hasattr(self, '_m_is_value_str') else None
|
|
1002
|
+
|
|
1003
|
+
self._m_is_value_str = ((self.value_or_ptr != 0) and ( ((self.tag_enum == Elf.DynamicArrayTags.needed) or (self.tag_enum == Elf.DynamicArrayTags.soname) or (self.tag_enum == Elf.DynamicArrayTags.rpath) or (self.tag_enum == Elf.DynamicArrayTags.runpath) or (self.tag_enum == Elf.DynamicArrayTags.sunw_auxiliary) or (self.tag_enum == Elf.DynamicArrayTags.sunw_filter) or (self.tag_enum == Elf.DynamicArrayTags.auxiliary) or (self.tag_enum == Elf.DynamicArrayTags.filter) or (self.tag_enum == Elf.DynamicArrayTags.config) or (self.tag_enum == Elf.DynamicArrayTags.depaudit) or (self.tag_enum == Elf.DynamicArrayTags.audit)) ))
|
|
1004
|
+
return self._m_is_value_str if hasattr(self, '_m_is_value_str') else None
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
class SectionHeader(KaitaiStruct):
|
|
1008
|
+
SEQ_FIELDS = ["ofs_name", "type", "flags", "addr", "ofs_body", "len_body", "linked_section_idx", "info", "align", "entry_size"]
|
|
1009
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
1010
|
+
self._io = _io
|
|
1011
|
+
self._parent = _parent
|
|
1012
|
+
self._root = _root if _root else self
|
|
1013
|
+
self._is_le = _is_le
|
|
1014
|
+
self._debug = collections.defaultdict(dict)
|
|
1015
|
+
|
|
1016
|
+
def _read(self):
|
|
1017
|
+
if not hasattr(self, '_is_le'):
|
|
1018
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/section_header")
|
|
1019
|
+
elif self._is_le == True:
|
|
1020
|
+
self._read_le()
|
|
1021
|
+
elif self._is_le == False:
|
|
1022
|
+
self._read_be()
|
|
1023
|
+
|
|
1024
|
+
def _read_le(self):
|
|
1025
|
+
self._debug['ofs_name']['start'] = self._io.pos()
|
|
1026
|
+
self.ofs_name = self._io.read_u4le()
|
|
1027
|
+
self._debug['ofs_name']['end'] = self._io.pos()
|
|
1028
|
+
self._debug['type']['start'] = self._io.pos()
|
|
1029
|
+
self.type = KaitaiStream.resolve_enum(Elf.ShType, self._io.read_u4le())
|
|
1030
|
+
self._debug['type']['end'] = self._io.pos()
|
|
1031
|
+
self._debug['flags']['start'] = self._io.pos()
|
|
1032
|
+
_on = self._root.bits
|
|
1033
|
+
if _on == Elf.Bits.b32:
|
|
1034
|
+
self.flags = self._io.read_u4le()
|
|
1035
|
+
elif _on == Elf.Bits.b64:
|
|
1036
|
+
self.flags = self._io.read_u8le()
|
|
1037
|
+
self._debug['flags']['end'] = self._io.pos()
|
|
1038
|
+
self._debug['addr']['start'] = self._io.pos()
|
|
1039
|
+
_on = self._root.bits
|
|
1040
|
+
if _on == Elf.Bits.b32:
|
|
1041
|
+
self.addr = self._io.read_u4le()
|
|
1042
|
+
elif _on == Elf.Bits.b64:
|
|
1043
|
+
self.addr = self._io.read_u8le()
|
|
1044
|
+
self._debug['addr']['end'] = self._io.pos()
|
|
1045
|
+
self._debug['ofs_body']['start'] = self._io.pos()
|
|
1046
|
+
_on = self._root.bits
|
|
1047
|
+
if _on == Elf.Bits.b32:
|
|
1048
|
+
self.ofs_body = self._io.read_u4le()
|
|
1049
|
+
elif _on == Elf.Bits.b64:
|
|
1050
|
+
self.ofs_body = self._io.read_u8le()
|
|
1051
|
+
self._debug['ofs_body']['end'] = self._io.pos()
|
|
1052
|
+
self._debug['len_body']['start'] = self._io.pos()
|
|
1053
|
+
_on = self._root.bits
|
|
1054
|
+
if _on == Elf.Bits.b32:
|
|
1055
|
+
self.len_body = self._io.read_u4le()
|
|
1056
|
+
elif _on == Elf.Bits.b64:
|
|
1057
|
+
self.len_body = self._io.read_u8le()
|
|
1058
|
+
self._debug['len_body']['end'] = self._io.pos()
|
|
1059
|
+
self._debug['linked_section_idx']['start'] = self._io.pos()
|
|
1060
|
+
self.linked_section_idx = self._io.read_u4le()
|
|
1061
|
+
self._debug['linked_section_idx']['end'] = self._io.pos()
|
|
1062
|
+
self._debug['info']['start'] = self._io.pos()
|
|
1063
|
+
self.info = self._io.read_bytes(4)
|
|
1064
|
+
self._debug['info']['end'] = self._io.pos()
|
|
1065
|
+
self._debug['align']['start'] = self._io.pos()
|
|
1066
|
+
_on = self._root.bits
|
|
1067
|
+
if _on == Elf.Bits.b32:
|
|
1068
|
+
self.align = self._io.read_u4le()
|
|
1069
|
+
elif _on == Elf.Bits.b64:
|
|
1070
|
+
self.align = self._io.read_u8le()
|
|
1071
|
+
self._debug['align']['end'] = self._io.pos()
|
|
1072
|
+
self._debug['entry_size']['start'] = self._io.pos()
|
|
1073
|
+
_on = self._root.bits
|
|
1074
|
+
if _on == Elf.Bits.b32:
|
|
1075
|
+
self.entry_size = self._io.read_u4le()
|
|
1076
|
+
elif _on == Elf.Bits.b64:
|
|
1077
|
+
self.entry_size = self._io.read_u8le()
|
|
1078
|
+
self._debug['entry_size']['end'] = self._io.pos()
|
|
1079
|
+
|
|
1080
|
+
def _read_be(self):
|
|
1081
|
+
self._debug['ofs_name']['start'] = self._io.pos()
|
|
1082
|
+
self.ofs_name = self._io.read_u4be()
|
|
1083
|
+
self._debug['ofs_name']['end'] = self._io.pos()
|
|
1084
|
+
self._debug['type']['start'] = self._io.pos()
|
|
1085
|
+
self.type = KaitaiStream.resolve_enum(Elf.ShType, self._io.read_u4be())
|
|
1086
|
+
self._debug['type']['end'] = self._io.pos()
|
|
1087
|
+
self._debug['flags']['start'] = self._io.pos()
|
|
1088
|
+
_on = self._root.bits
|
|
1089
|
+
if _on == Elf.Bits.b32:
|
|
1090
|
+
self.flags = self._io.read_u4be()
|
|
1091
|
+
elif _on == Elf.Bits.b64:
|
|
1092
|
+
self.flags = self._io.read_u8be()
|
|
1093
|
+
self._debug['flags']['end'] = self._io.pos()
|
|
1094
|
+
self._debug['addr']['start'] = self._io.pos()
|
|
1095
|
+
_on = self._root.bits
|
|
1096
|
+
if _on == Elf.Bits.b32:
|
|
1097
|
+
self.addr = self._io.read_u4be()
|
|
1098
|
+
elif _on == Elf.Bits.b64:
|
|
1099
|
+
self.addr = self._io.read_u8be()
|
|
1100
|
+
self._debug['addr']['end'] = self._io.pos()
|
|
1101
|
+
self._debug['ofs_body']['start'] = self._io.pos()
|
|
1102
|
+
_on = self._root.bits
|
|
1103
|
+
if _on == Elf.Bits.b32:
|
|
1104
|
+
self.ofs_body = self._io.read_u4be()
|
|
1105
|
+
elif _on == Elf.Bits.b64:
|
|
1106
|
+
self.ofs_body = self._io.read_u8be()
|
|
1107
|
+
self._debug['ofs_body']['end'] = self._io.pos()
|
|
1108
|
+
self._debug['len_body']['start'] = self._io.pos()
|
|
1109
|
+
_on = self._root.bits
|
|
1110
|
+
if _on == Elf.Bits.b32:
|
|
1111
|
+
self.len_body = self._io.read_u4be()
|
|
1112
|
+
elif _on == Elf.Bits.b64:
|
|
1113
|
+
self.len_body = self._io.read_u8be()
|
|
1114
|
+
self._debug['len_body']['end'] = self._io.pos()
|
|
1115
|
+
self._debug['linked_section_idx']['start'] = self._io.pos()
|
|
1116
|
+
self.linked_section_idx = self._io.read_u4be()
|
|
1117
|
+
self._debug['linked_section_idx']['end'] = self._io.pos()
|
|
1118
|
+
self._debug['info']['start'] = self._io.pos()
|
|
1119
|
+
self.info = self._io.read_bytes(4)
|
|
1120
|
+
self._debug['info']['end'] = self._io.pos()
|
|
1121
|
+
self._debug['align']['start'] = self._io.pos()
|
|
1122
|
+
_on = self._root.bits
|
|
1123
|
+
if _on == Elf.Bits.b32:
|
|
1124
|
+
self.align = self._io.read_u4be()
|
|
1125
|
+
elif _on == Elf.Bits.b64:
|
|
1126
|
+
self.align = self._io.read_u8be()
|
|
1127
|
+
self._debug['align']['end'] = self._io.pos()
|
|
1128
|
+
self._debug['entry_size']['start'] = self._io.pos()
|
|
1129
|
+
_on = self._root.bits
|
|
1130
|
+
if _on == Elf.Bits.b32:
|
|
1131
|
+
self.entry_size = self._io.read_u4be()
|
|
1132
|
+
elif _on == Elf.Bits.b64:
|
|
1133
|
+
self.entry_size = self._io.read_u8be()
|
|
1134
|
+
self._debug['entry_size']['end'] = self._io.pos()
|
|
1135
|
+
|
|
1136
|
+
@property
|
|
1137
|
+
def body(self):
|
|
1138
|
+
if hasattr(self, '_m_body'):
|
|
1139
|
+
return self._m_body if hasattr(self, '_m_body') else None
|
|
1140
|
+
|
|
1141
|
+
if self.type != Elf.ShType.nobits:
|
|
1142
|
+
io = self._root._io
|
|
1143
|
+
_pos = io.pos()
|
|
1144
|
+
io.seek(self.ofs_body)
|
|
1145
|
+
self._debug['_m_body']['start'] = io.pos()
|
|
1146
|
+
if self._is_le:
|
|
1147
|
+
_on = self.type
|
|
1148
|
+
if _on == Elf.ShType.rel:
|
|
1149
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1150
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1151
|
+
self._m_body = Elf.EndianElf.RelocationSection(False, _io__raw__m_body, self, self._root, self._is_le)
|
|
1152
|
+
self._m_body._read()
|
|
1153
|
+
elif _on == Elf.ShType.note:
|
|
1154
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1155
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1156
|
+
self._m_body = Elf.EndianElf.NoteSection(_io__raw__m_body, self, self._root, self._is_le)
|
|
1157
|
+
self._m_body._read()
|
|
1158
|
+
elif _on == Elf.ShType.symtab:
|
|
1159
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1160
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1161
|
+
self._m_body = Elf.EndianElf.DynsymSection(_io__raw__m_body, self, self._root, self._is_le)
|
|
1162
|
+
self._m_body._read()
|
|
1163
|
+
elif _on == Elf.ShType.strtab:
|
|
1164
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1165
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1166
|
+
self._m_body = Elf.EndianElf.StringsStruct(_io__raw__m_body, self, self._root, self._is_le)
|
|
1167
|
+
self._m_body._read()
|
|
1168
|
+
elif _on == Elf.ShType.dynamic:
|
|
1169
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1170
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1171
|
+
self._m_body = Elf.EndianElf.DynamicSection(_io__raw__m_body, self, self._root, self._is_le)
|
|
1172
|
+
self._m_body._read()
|
|
1173
|
+
elif _on == Elf.ShType.dynsym:
|
|
1174
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1175
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1176
|
+
self._m_body = Elf.EndianElf.DynsymSection(_io__raw__m_body, self, self._root, self._is_le)
|
|
1177
|
+
self._m_body._read()
|
|
1178
|
+
elif _on == Elf.ShType.rela:
|
|
1179
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1180
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1181
|
+
self._m_body = Elf.EndianElf.RelocationSection(True, _io__raw__m_body, self, self._root, self._is_le)
|
|
1182
|
+
self._m_body._read()
|
|
1183
|
+
else:
|
|
1184
|
+
self._m_body = io.read_bytes(self.len_body)
|
|
1185
|
+
else:
|
|
1186
|
+
_on = self.type
|
|
1187
|
+
if _on == Elf.ShType.rel:
|
|
1188
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1189
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1190
|
+
self._m_body = Elf.EndianElf.RelocationSection(False, _io__raw__m_body, self, self._root, self._is_le)
|
|
1191
|
+
self._m_body._read()
|
|
1192
|
+
elif _on == Elf.ShType.note:
|
|
1193
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1194
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1195
|
+
self._m_body = Elf.EndianElf.NoteSection(_io__raw__m_body, self, self._root, self._is_le)
|
|
1196
|
+
self._m_body._read()
|
|
1197
|
+
elif _on == Elf.ShType.symtab:
|
|
1198
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1199
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1200
|
+
self._m_body = Elf.EndianElf.DynsymSection(_io__raw__m_body, self, self._root, self._is_le)
|
|
1201
|
+
self._m_body._read()
|
|
1202
|
+
elif _on == Elf.ShType.strtab:
|
|
1203
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1204
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1205
|
+
self._m_body = Elf.EndianElf.StringsStruct(_io__raw__m_body, self, self._root, self._is_le)
|
|
1206
|
+
self._m_body._read()
|
|
1207
|
+
elif _on == Elf.ShType.dynamic:
|
|
1208
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1209
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1210
|
+
self._m_body = Elf.EndianElf.DynamicSection(_io__raw__m_body, self, self._root, self._is_le)
|
|
1211
|
+
self._m_body._read()
|
|
1212
|
+
elif _on == Elf.ShType.dynsym:
|
|
1213
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1214
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1215
|
+
self._m_body = Elf.EndianElf.DynsymSection(_io__raw__m_body, self, self._root, self._is_le)
|
|
1216
|
+
self._m_body._read()
|
|
1217
|
+
elif _on == Elf.ShType.rela:
|
|
1218
|
+
self._raw__m_body = io.read_bytes(self.len_body)
|
|
1219
|
+
_io__raw__m_body = KaitaiStream(BytesIO(self._raw__m_body))
|
|
1220
|
+
self._m_body = Elf.EndianElf.RelocationSection(True, _io__raw__m_body, self, self._root, self._is_le)
|
|
1221
|
+
self._m_body._read()
|
|
1222
|
+
else:
|
|
1223
|
+
self._m_body = io.read_bytes(self.len_body)
|
|
1224
|
+
self._debug['_m_body']['end'] = io.pos()
|
|
1225
|
+
io.seek(_pos)
|
|
1226
|
+
|
|
1227
|
+
return self._m_body if hasattr(self, '_m_body') else None
|
|
1228
|
+
|
|
1229
|
+
@property
|
|
1230
|
+
def linked_section(self):
|
|
1231
|
+
"""may reference a later section header, so don't try to access too early (use only lazy `instances`).
|
|
1232
|
+
|
|
1233
|
+
.. seealso::
|
|
1234
|
+
Source - https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.sheader.html#sh_link
|
|
1235
|
+
"""
|
|
1236
|
+
if hasattr(self, '_m_linked_section'):
|
|
1237
|
+
return self._m_linked_section if hasattr(self, '_m_linked_section') else None
|
|
1238
|
+
|
|
1239
|
+
if ((self.linked_section_idx != Elf.SectionHeaderIdxSpecial.undefined.value) and (self.linked_section_idx < self._root.header.qty_section_header)) :
|
|
1240
|
+
self._m_linked_section = self._root.header.section_headers[self.linked_section_idx]
|
|
1241
|
+
|
|
1242
|
+
return self._m_linked_section if hasattr(self, '_m_linked_section') else None
|
|
1243
|
+
|
|
1244
|
+
@property
|
|
1245
|
+
def name(self):
|
|
1246
|
+
if hasattr(self, '_m_name'):
|
|
1247
|
+
return self._m_name if hasattr(self, '_m_name') else None
|
|
1248
|
+
|
|
1249
|
+
io = self._root.header.section_names._io
|
|
1250
|
+
_pos = io.pos()
|
|
1251
|
+
io.seek(self.ofs_name)
|
|
1252
|
+
self._debug['_m_name']['start'] = io.pos()
|
|
1253
|
+
if self._is_le:
|
|
1254
|
+
self._m_name = (io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
|
|
1255
|
+
else:
|
|
1256
|
+
self._m_name = (io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
|
|
1257
|
+
self._debug['_m_name']['end'] = io.pos()
|
|
1258
|
+
io.seek(_pos)
|
|
1259
|
+
return self._m_name if hasattr(self, '_m_name') else None
|
|
1260
|
+
|
|
1261
|
+
@property
|
|
1262
|
+
def flags_obj(self):
|
|
1263
|
+
if hasattr(self, '_m_flags_obj'):
|
|
1264
|
+
return self._m_flags_obj if hasattr(self, '_m_flags_obj') else None
|
|
1265
|
+
|
|
1266
|
+
self._debug['_m_flags_obj']['start'] = self._io.pos()
|
|
1267
|
+
if self._is_le:
|
|
1268
|
+
self._m_flags_obj = Elf.SectionHeaderFlags(self.flags, self._io, self, self._root)
|
|
1269
|
+
self._m_flags_obj._read()
|
|
1270
|
+
else:
|
|
1271
|
+
self._m_flags_obj = Elf.SectionHeaderFlags(self.flags, self._io, self, self._root)
|
|
1272
|
+
self._m_flags_obj._read()
|
|
1273
|
+
self._debug['_m_flags_obj']['end'] = self._io.pos()
|
|
1274
|
+
return self._m_flags_obj if hasattr(self, '_m_flags_obj') else None
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
class RelocationSection(KaitaiStruct):
|
|
1278
|
+
"""
|
|
1279
|
+
.. seealso::
|
|
1280
|
+
Source - https://docs.oracle.com/en/operating-systems/solaris/oracle-solaris/11.4/linkers-libraries/relocation-sections.html
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
.. seealso::
|
|
1284
|
+
Source - https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.reloc.html
|
|
1285
|
+
"""
|
|
1286
|
+
SEQ_FIELDS = ["entries"]
|
|
1287
|
+
def __init__(self, has_addend, _io, _parent=None, _root=None, _is_le=None):
|
|
1288
|
+
self._io = _io
|
|
1289
|
+
self._parent = _parent
|
|
1290
|
+
self._root = _root if _root else self
|
|
1291
|
+
self._is_le = _is_le
|
|
1292
|
+
self.has_addend = has_addend
|
|
1293
|
+
self._debug = collections.defaultdict(dict)
|
|
1294
|
+
|
|
1295
|
+
def _read(self):
|
|
1296
|
+
if not hasattr(self, '_is_le'):
|
|
1297
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/relocation_section")
|
|
1298
|
+
elif self._is_le == True:
|
|
1299
|
+
self._read_le()
|
|
1300
|
+
elif self._is_le == False:
|
|
1301
|
+
self._read_be()
|
|
1302
|
+
|
|
1303
|
+
def _read_le(self):
|
|
1304
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
1305
|
+
self.entries = []
|
|
1306
|
+
i = 0
|
|
1307
|
+
while not self._io.is_eof():
|
|
1308
|
+
if not 'arr' in self._debug['entries']:
|
|
1309
|
+
self._debug['entries']['arr'] = []
|
|
1310
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
1311
|
+
_t_entries = Elf.EndianElf.RelocationSectionEntry(self._io, self, self._root, self._is_le)
|
|
1312
|
+
_t_entries._read()
|
|
1313
|
+
self.entries.append(_t_entries)
|
|
1314
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
1315
|
+
i += 1
|
|
1316
|
+
|
|
1317
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
1318
|
+
|
|
1319
|
+
def _read_be(self):
|
|
1320
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
1321
|
+
self.entries = []
|
|
1322
|
+
i = 0
|
|
1323
|
+
while not self._io.is_eof():
|
|
1324
|
+
if not 'arr' in self._debug['entries']:
|
|
1325
|
+
self._debug['entries']['arr'] = []
|
|
1326
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
1327
|
+
_t_entries = Elf.EndianElf.RelocationSectionEntry(self._io, self, self._root, self._is_le)
|
|
1328
|
+
_t_entries._read()
|
|
1329
|
+
self.entries.append(_t_entries)
|
|
1330
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
1331
|
+
i += 1
|
|
1332
|
+
|
|
1333
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
class DynamicSection(KaitaiStruct):
|
|
1337
|
+
SEQ_FIELDS = ["entries"]
|
|
1338
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
1339
|
+
self._io = _io
|
|
1340
|
+
self._parent = _parent
|
|
1341
|
+
self._root = _root if _root else self
|
|
1342
|
+
self._is_le = _is_le
|
|
1343
|
+
self._debug = collections.defaultdict(dict)
|
|
1344
|
+
|
|
1345
|
+
def _read(self):
|
|
1346
|
+
if not hasattr(self, '_is_le'):
|
|
1347
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/dynamic_section")
|
|
1348
|
+
elif self._is_le == True:
|
|
1349
|
+
self._read_le()
|
|
1350
|
+
elif self._is_le == False:
|
|
1351
|
+
self._read_be()
|
|
1352
|
+
|
|
1353
|
+
def _read_le(self):
|
|
1354
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
1355
|
+
self.entries = []
|
|
1356
|
+
i = 0
|
|
1357
|
+
while not self._io.is_eof():
|
|
1358
|
+
if not 'arr' in self._debug['entries']:
|
|
1359
|
+
self._debug['entries']['arr'] = []
|
|
1360
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
1361
|
+
_t_entries = Elf.EndianElf.DynamicSectionEntry(self._io, self, self._root, self._is_le)
|
|
1362
|
+
_t_entries._read()
|
|
1363
|
+
self.entries.append(_t_entries)
|
|
1364
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
1365
|
+
i += 1
|
|
1366
|
+
|
|
1367
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
1368
|
+
|
|
1369
|
+
def _read_be(self):
|
|
1370
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
1371
|
+
self.entries = []
|
|
1372
|
+
i = 0
|
|
1373
|
+
while not self._io.is_eof():
|
|
1374
|
+
if not 'arr' in self._debug['entries']:
|
|
1375
|
+
self._debug['entries']['arr'] = []
|
|
1376
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
1377
|
+
_t_entries = Elf.EndianElf.DynamicSectionEntry(self._io, self, self._root, self._is_le)
|
|
1378
|
+
_t_entries._read()
|
|
1379
|
+
self.entries.append(_t_entries)
|
|
1380
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
1381
|
+
i += 1
|
|
1382
|
+
|
|
1383
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
1384
|
+
|
|
1385
|
+
@property
|
|
1386
|
+
def is_string_table_linked(self):
|
|
1387
|
+
if hasattr(self, '_m_is_string_table_linked'):
|
|
1388
|
+
return self._m_is_string_table_linked if hasattr(self, '_m_is_string_table_linked') else None
|
|
1389
|
+
|
|
1390
|
+
self._m_is_string_table_linked = self._parent.linked_section.type == Elf.ShType.strtab
|
|
1391
|
+
return self._m_is_string_table_linked if hasattr(self, '_m_is_string_table_linked') else None
|
|
1392
|
+
|
|
1393
|
+
|
|
1394
|
+
class DynsymSection(KaitaiStruct):
|
|
1395
|
+
SEQ_FIELDS = ["entries"]
|
|
1396
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
1397
|
+
self._io = _io
|
|
1398
|
+
self._parent = _parent
|
|
1399
|
+
self._root = _root if _root else self
|
|
1400
|
+
self._is_le = _is_le
|
|
1401
|
+
self._debug = collections.defaultdict(dict)
|
|
1402
|
+
|
|
1403
|
+
def _read(self):
|
|
1404
|
+
if not hasattr(self, '_is_le'):
|
|
1405
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/dynsym_section")
|
|
1406
|
+
elif self._is_le == True:
|
|
1407
|
+
self._read_le()
|
|
1408
|
+
elif self._is_le == False:
|
|
1409
|
+
self._read_be()
|
|
1410
|
+
|
|
1411
|
+
def _read_le(self):
|
|
1412
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
1413
|
+
self.entries = []
|
|
1414
|
+
i = 0
|
|
1415
|
+
while not self._io.is_eof():
|
|
1416
|
+
if not 'arr' in self._debug['entries']:
|
|
1417
|
+
self._debug['entries']['arr'] = []
|
|
1418
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
1419
|
+
_t_entries = Elf.EndianElf.DynsymSectionEntry(self._io, self, self._root, self._is_le)
|
|
1420
|
+
_t_entries._read()
|
|
1421
|
+
self.entries.append(_t_entries)
|
|
1422
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
1423
|
+
i += 1
|
|
1424
|
+
|
|
1425
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
1426
|
+
|
|
1427
|
+
def _read_be(self):
|
|
1428
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
1429
|
+
self.entries = []
|
|
1430
|
+
i = 0
|
|
1431
|
+
while not self._io.is_eof():
|
|
1432
|
+
if not 'arr' in self._debug['entries']:
|
|
1433
|
+
self._debug['entries']['arr'] = []
|
|
1434
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
1435
|
+
_t_entries = Elf.EndianElf.DynsymSectionEntry(self._io, self, self._root, self._is_le)
|
|
1436
|
+
_t_entries._read()
|
|
1437
|
+
self.entries.append(_t_entries)
|
|
1438
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
1439
|
+
i += 1
|
|
1440
|
+
|
|
1441
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
1442
|
+
|
|
1443
|
+
@property
|
|
1444
|
+
def is_string_table_linked(self):
|
|
1445
|
+
if hasattr(self, '_m_is_string_table_linked'):
|
|
1446
|
+
return self._m_is_string_table_linked if hasattr(self, '_m_is_string_table_linked') else None
|
|
1447
|
+
|
|
1448
|
+
self._m_is_string_table_linked = self._parent.linked_section.type == Elf.ShType.strtab
|
|
1449
|
+
return self._m_is_string_table_linked if hasattr(self, '_m_is_string_table_linked') else None
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
class RelocationSectionEntry(KaitaiStruct):
|
|
1453
|
+
SEQ_FIELDS = ["offset", "info", "addend"]
|
|
1454
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
1455
|
+
self._io = _io
|
|
1456
|
+
self._parent = _parent
|
|
1457
|
+
self._root = _root if _root else self
|
|
1458
|
+
self._is_le = _is_le
|
|
1459
|
+
self._debug = collections.defaultdict(dict)
|
|
1460
|
+
|
|
1461
|
+
def _read(self):
|
|
1462
|
+
if not hasattr(self, '_is_le'):
|
|
1463
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/relocation_section_entry")
|
|
1464
|
+
elif self._is_le == True:
|
|
1465
|
+
self._read_le()
|
|
1466
|
+
elif self._is_le == False:
|
|
1467
|
+
self._read_be()
|
|
1468
|
+
|
|
1469
|
+
def _read_le(self):
|
|
1470
|
+
self._debug['offset']['start'] = self._io.pos()
|
|
1471
|
+
_on = self._root.bits
|
|
1472
|
+
if _on == Elf.Bits.b32:
|
|
1473
|
+
self.offset = self._io.read_u4le()
|
|
1474
|
+
elif _on == Elf.Bits.b64:
|
|
1475
|
+
self.offset = self._io.read_u8le()
|
|
1476
|
+
self._debug['offset']['end'] = self._io.pos()
|
|
1477
|
+
self._debug['info']['start'] = self._io.pos()
|
|
1478
|
+
_on = self._root.bits
|
|
1479
|
+
if _on == Elf.Bits.b32:
|
|
1480
|
+
self.info = self._io.read_u4le()
|
|
1481
|
+
elif _on == Elf.Bits.b64:
|
|
1482
|
+
self.info = self._io.read_u8le()
|
|
1483
|
+
self._debug['info']['end'] = self._io.pos()
|
|
1484
|
+
if self._parent.has_addend:
|
|
1485
|
+
self._debug['addend']['start'] = self._io.pos()
|
|
1486
|
+
_on = self._root.bits
|
|
1487
|
+
if _on == Elf.Bits.b32:
|
|
1488
|
+
self.addend = self._io.read_s4le()
|
|
1489
|
+
elif _on == Elf.Bits.b64:
|
|
1490
|
+
self.addend = self._io.read_s8le()
|
|
1491
|
+
self._debug['addend']['end'] = self._io.pos()
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
def _read_be(self):
|
|
1495
|
+
self._debug['offset']['start'] = self._io.pos()
|
|
1496
|
+
_on = self._root.bits
|
|
1497
|
+
if _on == Elf.Bits.b32:
|
|
1498
|
+
self.offset = self._io.read_u4be()
|
|
1499
|
+
elif _on == Elf.Bits.b64:
|
|
1500
|
+
self.offset = self._io.read_u8be()
|
|
1501
|
+
self._debug['offset']['end'] = self._io.pos()
|
|
1502
|
+
self._debug['info']['start'] = self._io.pos()
|
|
1503
|
+
_on = self._root.bits
|
|
1504
|
+
if _on == Elf.Bits.b32:
|
|
1505
|
+
self.info = self._io.read_u4be()
|
|
1506
|
+
elif _on == Elf.Bits.b64:
|
|
1507
|
+
self.info = self._io.read_u8be()
|
|
1508
|
+
self._debug['info']['end'] = self._io.pos()
|
|
1509
|
+
if self._parent.has_addend:
|
|
1510
|
+
self._debug['addend']['start'] = self._io.pos()
|
|
1511
|
+
_on = self._root.bits
|
|
1512
|
+
if _on == Elf.Bits.b32:
|
|
1513
|
+
self.addend = self._io.read_s4be()
|
|
1514
|
+
elif _on == Elf.Bits.b64:
|
|
1515
|
+
self.addend = self._io.read_s8be()
|
|
1516
|
+
self._debug['addend']['end'] = self._io.pos()
|
|
1517
|
+
|
|
1518
|
+
|
|
1519
|
+
|
|
1520
|
+
class DynsymSectionEntry(KaitaiStruct):
|
|
1521
|
+
"""
|
|
1522
|
+
.. seealso::
|
|
1523
|
+
Source - https://docs.oracle.com/en/operating-systems/solaris/oracle-solaris/11.4/linkers-libraries/symbol-table-section.html
|
|
1524
|
+
|
|
1525
|
+
|
|
1526
|
+
.. seealso::
|
|
1527
|
+
Source - https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.symtab.html
|
|
1528
|
+
"""
|
|
1529
|
+
SEQ_FIELDS = ["ofs_name", "value_b32", "size_b32", "bind", "type", "other", "sh_idx", "value_b64", "size_b64"]
|
|
1530
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
1531
|
+
self._io = _io
|
|
1532
|
+
self._parent = _parent
|
|
1533
|
+
self._root = _root if _root else self
|
|
1534
|
+
self._is_le = _is_le
|
|
1535
|
+
self._debug = collections.defaultdict(dict)
|
|
1536
|
+
|
|
1537
|
+
def _read(self):
|
|
1538
|
+
if not hasattr(self, '_is_le'):
|
|
1539
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/dynsym_section_entry")
|
|
1540
|
+
elif self._is_le == True:
|
|
1541
|
+
self._read_le()
|
|
1542
|
+
elif self._is_le == False:
|
|
1543
|
+
self._read_be()
|
|
1544
|
+
|
|
1545
|
+
def _read_le(self):
|
|
1546
|
+
self._debug['ofs_name']['start'] = self._io.pos()
|
|
1547
|
+
self.ofs_name = self._io.read_u4le()
|
|
1548
|
+
self._debug['ofs_name']['end'] = self._io.pos()
|
|
1549
|
+
if self._root.bits == Elf.Bits.b32:
|
|
1550
|
+
self._debug['value_b32']['start'] = self._io.pos()
|
|
1551
|
+
self.value_b32 = self._io.read_u4le()
|
|
1552
|
+
self._debug['value_b32']['end'] = self._io.pos()
|
|
1553
|
+
|
|
1554
|
+
if self._root.bits == Elf.Bits.b32:
|
|
1555
|
+
self._debug['size_b32']['start'] = self._io.pos()
|
|
1556
|
+
self.size_b32 = self._io.read_u4le()
|
|
1557
|
+
self._debug['size_b32']['end'] = self._io.pos()
|
|
1558
|
+
|
|
1559
|
+
self._debug['bind']['start'] = self._io.pos()
|
|
1560
|
+
self.bind = KaitaiStream.resolve_enum(Elf.SymbolBinding, self._io.read_bits_int_be(4))
|
|
1561
|
+
self._debug['bind']['end'] = self._io.pos()
|
|
1562
|
+
self._debug['type']['start'] = self._io.pos()
|
|
1563
|
+
self.type = KaitaiStream.resolve_enum(Elf.SymbolType, self._io.read_bits_int_be(4))
|
|
1564
|
+
self._debug['type']['end'] = self._io.pos()
|
|
1565
|
+
self._io.align_to_byte()
|
|
1566
|
+
self._debug['other']['start'] = self._io.pos()
|
|
1567
|
+
self.other = self._io.read_u1()
|
|
1568
|
+
self._debug['other']['end'] = self._io.pos()
|
|
1569
|
+
self._debug['sh_idx']['start'] = self._io.pos()
|
|
1570
|
+
self.sh_idx = self._io.read_u2le()
|
|
1571
|
+
self._debug['sh_idx']['end'] = self._io.pos()
|
|
1572
|
+
if self._root.bits == Elf.Bits.b64:
|
|
1573
|
+
self._debug['value_b64']['start'] = self._io.pos()
|
|
1574
|
+
self.value_b64 = self._io.read_u8le()
|
|
1575
|
+
self._debug['value_b64']['end'] = self._io.pos()
|
|
1576
|
+
|
|
1577
|
+
if self._root.bits == Elf.Bits.b64:
|
|
1578
|
+
self._debug['size_b64']['start'] = self._io.pos()
|
|
1579
|
+
self.size_b64 = self._io.read_u8le()
|
|
1580
|
+
self._debug['size_b64']['end'] = self._io.pos()
|
|
1581
|
+
|
|
1582
|
+
|
|
1583
|
+
def _read_be(self):
|
|
1584
|
+
self._debug['ofs_name']['start'] = self._io.pos()
|
|
1585
|
+
self.ofs_name = self._io.read_u4be()
|
|
1586
|
+
self._debug['ofs_name']['end'] = self._io.pos()
|
|
1587
|
+
if self._root.bits == Elf.Bits.b32:
|
|
1588
|
+
self._debug['value_b32']['start'] = self._io.pos()
|
|
1589
|
+
self.value_b32 = self._io.read_u4be()
|
|
1590
|
+
self._debug['value_b32']['end'] = self._io.pos()
|
|
1591
|
+
|
|
1592
|
+
if self._root.bits == Elf.Bits.b32:
|
|
1593
|
+
self._debug['size_b32']['start'] = self._io.pos()
|
|
1594
|
+
self.size_b32 = self._io.read_u4be()
|
|
1595
|
+
self._debug['size_b32']['end'] = self._io.pos()
|
|
1596
|
+
|
|
1597
|
+
self._debug['bind']['start'] = self._io.pos()
|
|
1598
|
+
self.bind = KaitaiStream.resolve_enum(Elf.SymbolBinding, self._io.read_bits_int_be(4))
|
|
1599
|
+
self._debug['bind']['end'] = self._io.pos()
|
|
1600
|
+
self._debug['type']['start'] = self._io.pos()
|
|
1601
|
+
self.type = KaitaiStream.resolve_enum(Elf.SymbolType, self._io.read_bits_int_be(4))
|
|
1602
|
+
self._debug['type']['end'] = self._io.pos()
|
|
1603
|
+
self._io.align_to_byte()
|
|
1604
|
+
self._debug['other']['start'] = self._io.pos()
|
|
1605
|
+
self.other = self._io.read_u1()
|
|
1606
|
+
self._debug['other']['end'] = self._io.pos()
|
|
1607
|
+
self._debug['sh_idx']['start'] = self._io.pos()
|
|
1608
|
+
self.sh_idx = self._io.read_u2be()
|
|
1609
|
+
self._debug['sh_idx']['end'] = self._io.pos()
|
|
1610
|
+
if self._root.bits == Elf.Bits.b64:
|
|
1611
|
+
self._debug['value_b64']['start'] = self._io.pos()
|
|
1612
|
+
self.value_b64 = self._io.read_u8be()
|
|
1613
|
+
self._debug['value_b64']['end'] = self._io.pos()
|
|
1614
|
+
|
|
1615
|
+
if self._root.bits == Elf.Bits.b64:
|
|
1616
|
+
self._debug['size_b64']['start'] = self._io.pos()
|
|
1617
|
+
self.size_b64 = self._io.read_u8be()
|
|
1618
|
+
self._debug['size_b64']['end'] = self._io.pos()
|
|
1619
|
+
|
|
1620
|
+
|
|
1621
|
+
@property
|
|
1622
|
+
def is_sh_idx_reserved(self):
|
|
1623
|
+
if hasattr(self, '_m_is_sh_idx_reserved'):
|
|
1624
|
+
return self._m_is_sh_idx_reserved if hasattr(self, '_m_is_sh_idx_reserved') else None
|
|
1625
|
+
|
|
1626
|
+
self._m_is_sh_idx_reserved = ((self.sh_idx >= self._root.sh_idx_lo_reserved) and (self.sh_idx <= self._root.sh_idx_hi_reserved))
|
|
1627
|
+
return self._m_is_sh_idx_reserved if hasattr(self, '_m_is_sh_idx_reserved') else None
|
|
1628
|
+
|
|
1629
|
+
@property
|
|
1630
|
+
def is_sh_idx_os(self):
|
|
1631
|
+
if hasattr(self, '_m_is_sh_idx_os'):
|
|
1632
|
+
return self._m_is_sh_idx_os if hasattr(self, '_m_is_sh_idx_os') else None
|
|
1633
|
+
|
|
1634
|
+
self._m_is_sh_idx_os = ((self.sh_idx >= self._root.sh_idx_lo_os) and (self.sh_idx <= self._root.sh_idx_hi_os))
|
|
1635
|
+
return self._m_is_sh_idx_os if hasattr(self, '_m_is_sh_idx_os') else None
|
|
1636
|
+
|
|
1637
|
+
@property
|
|
1638
|
+
def is_sh_idx_proc(self):
|
|
1639
|
+
if hasattr(self, '_m_is_sh_idx_proc'):
|
|
1640
|
+
return self._m_is_sh_idx_proc if hasattr(self, '_m_is_sh_idx_proc') else None
|
|
1641
|
+
|
|
1642
|
+
self._m_is_sh_idx_proc = ((self.sh_idx >= self._root.sh_idx_lo_proc) and (self.sh_idx <= self._root.sh_idx_hi_proc))
|
|
1643
|
+
return self._m_is_sh_idx_proc if hasattr(self, '_m_is_sh_idx_proc') else None
|
|
1644
|
+
|
|
1645
|
+
@property
|
|
1646
|
+
def size(self):
|
|
1647
|
+
if hasattr(self, '_m_size'):
|
|
1648
|
+
return self._m_size if hasattr(self, '_m_size') else None
|
|
1649
|
+
|
|
1650
|
+
self._m_size = (self.size_b32 if self._root.bits == Elf.Bits.b32 else (self.size_b64 if self._root.bits == Elf.Bits.b64 else 0))
|
|
1651
|
+
return self._m_size if hasattr(self, '_m_size') else None
|
|
1652
|
+
|
|
1653
|
+
@property
|
|
1654
|
+
def visibility(self):
|
|
1655
|
+
if hasattr(self, '_m_visibility'):
|
|
1656
|
+
return self._m_visibility if hasattr(self, '_m_visibility') else None
|
|
1657
|
+
|
|
1658
|
+
self._m_visibility = KaitaiStream.resolve_enum(Elf.SymbolVisibility, (self.other & 3))
|
|
1659
|
+
return self._m_visibility if hasattr(self, '_m_visibility') else None
|
|
1660
|
+
|
|
1661
|
+
@property
|
|
1662
|
+
def value(self):
|
|
1663
|
+
if hasattr(self, '_m_value'):
|
|
1664
|
+
return self._m_value if hasattr(self, '_m_value') else None
|
|
1665
|
+
|
|
1666
|
+
self._m_value = (self.value_b32 if self._root.bits == Elf.Bits.b32 else (self.value_b64 if self._root.bits == Elf.Bits.b64 else 0))
|
|
1667
|
+
return self._m_value if hasattr(self, '_m_value') else None
|
|
1668
|
+
|
|
1669
|
+
@property
|
|
1670
|
+
def name(self):
|
|
1671
|
+
if hasattr(self, '_m_name'):
|
|
1672
|
+
return self._m_name if hasattr(self, '_m_name') else None
|
|
1673
|
+
|
|
1674
|
+
if ((self.ofs_name != 0) and (self._parent.is_string_table_linked)) :
|
|
1675
|
+
io = self._parent._parent.linked_section.body._io
|
|
1676
|
+
_pos = io.pos()
|
|
1677
|
+
io.seek(self.ofs_name)
|
|
1678
|
+
self._debug['_m_name']['start'] = io.pos()
|
|
1679
|
+
if self._is_le:
|
|
1680
|
+
self._m_name = (io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
|
|
1681
|
+
else:
|
|
1682
|
+
self._m_name = (io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
|
|
1683
|
+
self._debug['_m_name']['end'] = io.pos()
|
|
1684
|
+
io.seek(_pos)
|
|
1685
|
+
|
|
1686
|
+
return self._m_name if hasattr(self, '_m_name') else None
|
|
1687
|
+
|
|
1688
|
+
@property
|
|
1689
|
+
def sh_idx_special(self):
|
|
1690
|
+
if hasattr(self, '_m_sh_idx_special'):
|
|
1691
|
+
return self._m_sh_idx_special if hasattr(self, '_m_sh_idx_special') else None
|
|
1692
|
+
|
|
1693
|
+
self._m_sh_idx_special = KaitaiStream.resolve_enum(Elf.SectionHeaderIdxSpecial, self.sh_idx)
|
|
1694
|
+
return self._m_sh_idx_special if hasattr(self, '_m_sh_idx_special') else None
|
|
1695
|
+
|
|
1696
|
+
|
|
1697
|
+
class NoteSectionEntry(KaitaiStruct):
|
|
1698
|
+
"""
|
|
1699
|
+
.. seealso::
|
|
1700
|
+
Source - https://docs.oracle.com/en/operating-systems/solaris/oracle-solaris/11.4/linkers-libraries/note-section.html
|
|
1701
|
+
|
|
1702
|
+
|
|
1703
|
+
.. seealso::
|
|
1704
|
+
Source - https://refspecs.linuxfoundation.org/elf/gabi4+/ch5.pheader.html#note_section
|
|
1705
|
+
"""
|
|
1706
|
+
SEQ_FIELDS = ["len_name", "len_descriptor", "type", "name", "name_padding", "descriptor", "descriptor_padding"]
|
|
1707
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
1708
|
+
self._io = _io
|
|
1709
|
+
self._parent = _parent
|
|
1710
|
+
self._root = _root if _root else self
|
|
1711
|
+
self._is_le = _is_le
|
|
1712
|
+
self._debug = collections.defaultdict(dict)
|
|
1713
|
+
|
|
1714
|
+
def _read(self):
|
|
1715
|
+
if not hasattr(self, '_is_le'):
|
|
1716
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/note_section_entry")
|
|
1717
|
+
elif self._is_le == True:
|
|
1718
|
+
self._read_le()
|
|
1719
|
+
elif self._is_le == False:
|
|
1720
|
+
self._read_be()
|
|
1721
|
+
|
|
1722
|
+
def _read_le(self):
|
|
1723
|
+
self._debug['len_name']['start'] = self._io.pos()
|
|
1724
|
+
self.len_name = self._io.read_u4le()
|
|
1725
|
+
self._debug['len_name']['end'] = self._io.pos()
|
|
1726
|
+
self._debug['len_descriptor']['start'] = self._io.pos()
|
|
1727
|
+
self.len_descriptor = self._io.read_u4le()
|
|
1728
|
+
self._debug['len_descriptor']['end'] = self._io.pos()
|
|
1729
|
+
self._debug['type']['start'] = self._io.pos()
|
|
1730
|
+
self.type = self._io.read_u4le()
|
|
1731
|
+
self._debug['type']['end'] = self._io.pos()
|
|
1732
|
+
self._debug['name']['start'] = self._io.pos()
|
|
1733
|
+
self.name = KaitaiStream.bytes_terminate(self._io.read_bytes(self.len_name), 0, False)
|
|
1734
|
+
self._debug['name']['end'] = self._io.pos()
|
|
1735
|
+
self._debug['name_padding']['start'] = self._io.pos()
|
|
1736
|
+
self.name_padding = self._io.read_bytes((-(self.len_name) % 4))
|
|
1737
|
+
self._debug['name_padding']['end'] = self._io.pos()
|
|
1738
|
+
self._debug['descriptor']['start'] = self._io.pos()
|
|
1739
|
+
self.descriptor = self._io.read_bytes(self.len_descriptor)
|
|
1740
|
+
self._debug['descriptor']['end'] = self._io.pos()
|
|
1741
|
+
self._debug['descriptor_padding']['start'] = self._io.pos()
|
|
1742
|
+
self.descriptor_padding = self._io.read_bytes((-(self.len_descriptor) % 4))
|
|
1743
|
+
self._debug['descriptor_padding']['end'] = self._io.pos()
|
|
1744
|
+
|
|
1745
|
+
def _read_be(self):
|
|
1746
|
+
self._debug['len_name']['start'] = self._io.pos()
|
|
1747
|
+
self.len_name = self._io.read_u4be()
|
|
1748
|
+
self._debug['len_name']['end'] = self._io.pos()
|
|
1749
|
+
self._debug['len_descriptor']['start'] = self._io.pos()
|
|
1750
|
+
self.len_descriptor = self._io.read_u4be()
|
|
1751
|
+
self._debug['len_descriptor']['end'] = self._io.pos()
|
|
1752
|
+
self._debug['type']['start'] = self._io.pos()
|
|
1753
|
+
self.type = self._io.read_u4be()
|
|
1754
|
+
self._debug['type']['end'] = self._io.pos()
|
|
1755
|
+
self._debug['name']['start'] = self._io.pos()
|
|
1756
|
+
self.name = KaitaiStream.bytes_terminate(self._io.read_bytes(self.len_name), 0, False)
|
|
1757
|
+
self._debug['name']['end'] = self._io.pos()
|
|
1758
|
+
self._debug['name_padding']['start'] = self._io.pos()
|
|
1759
|
+
self.name_padding = self._io.read_bytes((-(self.len_name) % 4))
|
|
1760
|
+
self._debug['name_padding']['end'] = self._io.pos()
|
|
1761
|
+
self._debug['descriptor']['start'] = self._io.pos()
|
|
1762
|
+
self.descriptor = self._io.read_bytes(self.len_descriptor)
|
|
1763
|
+
self._debug['descriptor']['end'] = self._io.pos()
|
|
1764
|
+
self._debug['descriptor_padding']['start'] = self._io.pos()
|
|
1765
|
+
self.descriptor_padding = self._io.read_bytes((-(self.len_descriptor) % 4))
|
|
1766
|
+
self._debug['descriptor_padding']['end'] = self._io.pos()
|
|
1767
|
+
|
|
1768
|
+
|
|
1769
|
+
class StringsStruct(KaitaiStruct):
|
|
1770
|
+
SEQ_FIELDS = ["entries"]
|
|
1771
|
+
def __init__(self, _io, _parent=None, _root=None, _is_le=None):
|
|
1772
|
+
self._io = _io
|
|
1773
|
+
self._parent = _parent
|
|
1774
|
+
self._root = _root if _root else self
|
|
1775
|
+
self._is_le = _is_le
|
|
1776
|
+
self._debug = collections.defaultdict(dict)
|
|
1777
|
+
|
|
1778
|
+
def _read(self):
|
|
1779
|
+
if not hasattr(self, '_is_le'):
|
|
1780
|
+
raise kaitaistruct.UndecidedEndiannessError("/types/endian_elf/types/strings_struct")
|
|
1781
|
+
elif self._is_le == True:
|
|
1782
|
+
self._read_le()
|
|
1783
|
+
elif self._is_le == False:
|
|
1784
|
+
self._read_be()
|
|
1785
|
+
|
|
1786
|
+
def _read_le(self):
|
|
1787
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
1788
|
+
self.entries = []
|
|
1789
|
+
i = 0
|
|
1790
|
+
while not self._io.is_eof():
|
|
1791
|
+
if not 'arr' in self._debug['entries']:
|
|
1792
|
+
self._debug['entries']['arr'] = []
|
|
1793
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
1794
|
+
self.entries.append((self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8"))
|
|
1795
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
1796
|
+
i += 1
|
|
1797
|
+
|
|
1798
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
1799
|
+
|
|
1800
|
+
def _read_be(self):
|
|
1801
|
+
self._debug['entries']['start'] = self._io.pos()
|
|
1802
|
+
self.entries = []
|
|
1803
|
+
i = 0
|
|
1804
|
+
while not self._io.is_eof():
|
|
1805
|
+
if not 'arr' in self._debug['entries']:
|
|
1806
|
+
self._debug['entries']['arr'] = []
|
|
1807
|
+
self._debug['entries']['arr'].append({'start': self._io.pos()})
|
|
1808
|
+
self.entries.append((self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8"))
|
|
1809
|
+
self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
|
|
1810
|
+
i += 1
|
|
1811
|
+
|
|
1812
|
+
self._debug['entries']['end'] = self._io.pos()
|
|
1813
|
+
|
|
1814
|
+
|
|
1815
|
+
@property
|
|
1816
|
+
def program_headers(self):
|
|
1817
|
+
if hasattr(self, '_m_program_headers'):
|
|
1818
|
+
return self._m_program_headers if hasattr(self, '_m_program_headers') else None
|
|
1819
|
+
|
|
1820
|
+
_pos = self._io.pos()
|
|
1821
|
+
self._io.seek(self.program_header_offset)
|
|
1822
|
+
self._debug['_m_program_headers']['start'] = self._io.pos()
|
|
1823
|
+
if self._is_le:
|
|
1824
|
+
self._raw__m_program_headers = [None] * (self.qty_program_header)
|
|
1825
|
+
self._m_program_headers = [None] * (self.qty_program_header)
|
|
1826
|
+
for i in range(self.qty_program_header):
|
|
1827
|
+
if not 'arr' in self._debug['_m_program_headers']:
|
|
1828
|
+
self._debug['_m_program_headers']['arr'] = []
|
|
1829
|
+
self._debug['_m_program_headers']['arr'].append({'start': self._io.pos()})
|
|
1830
|
+
self._raw__m_program_headers[i] = self._io.read_bytes(self.program_header_entry_size)
|
|
1831
|
+
_io__raw__m_program_headers = KaitaiStream(BytesIO(self._raw__m_program_headers[i]))
|
|
1832
|
+
_t__m_program_headers = Elf.EndianElf.ProgramHeader(_io__raw__m_program_headers, self, self._root, self._is_le)
|
|
1833
|
+
_t__m_program_headers._read()
|
|
1834
|
+
self._m_program_headers[i] = _t__m_program_headers
|
|
1835
|
+
self._debug['_m_program_headers']['arr'][i]['end'] = self._io.pos()
|
|
1836
|
+
|
|
1837
|
+
else:
|
|
1838
|
+
self._raw__m_program_headers = [None] * (self.qty_program_header)
|
|
1839
|
+
self._m_program_headers = [None] * (self.qty_program_header)
|
|
1840
|
+
for i in range(self.qty_program_header):
|
|
1841
|
+
if not 'arr' in self._debug['_m_program_headers']:
|
|
1842
|
+
self._debug['_m_program_headers']['arr'] = []
|
|
1843
|
+
self._debug['_m_program_headers']['arr'].append({'start': self._io.pos()})
|
|
1844
|
+
self._raw__m_program_headers[i] = self._io.read_bytes(self.program_header_entry_size)
|
|
1845
|
+
_io__raw__m_program_headers = KaitaiStream(BytesIO(self._raw__m_program_headers[i]))
|
|
1846
|
+
_t__m_program_headers = Elf.EndianElf.ProgramHeader(_io__raw__m_program_headers, self, self._root, self._is_le)
|
|
1847
|
+
_t__m_program_headers._read()
|
|
1848
|
+
self._m_program_headers[i] = _t__m_program_headers
|
|
1849
|
+
self._debug['_m_program_headers']['arr'][i]['end'] = self._io.pos()
|
|
1850
|
+
|
|
1851
|
+
self._debug['_m_program_headers']['end'] = self._io.pos()
|
|
1852
|
+
self._io.seek(_pos)
|
|
1853
|
+
return self._m_program_headers if hasattr(self, '_m_program_headers') else None
|
|
1854
|
+
|
|
1855
|
+
@property
|
|
1856
|
+
def section_headers(self):
|
|
1857
|
+
if hasattr(self, '_m_section_headers'):
|
|
1858
|
+
return self._m_section_headers if hasattr(self, '_m_section_headers') else None
|
|
1859
|
+
|
|
1860
|
+
_pos = self._io.pos()
|
|
1861
|
+
self._io.seek(self.section_header_offset)
|
|
1862
|
+
self._debug['_m_section_headers']['start'] = self._io.pos()
|
|
1863
|
+
if self._is_le:
|
|
1864
|
+
self._raw__m_section_headers = [None] * (self.qty_section_header)
|
|
1865
|
+
self._m_section_headers = [None] * (self.qty_section_header)
|
|
1866
|
+
for i in range(self.qty_section_header):
|
|
1867
|
+
if not 'arr' in self._debug['_m_section_headers']:
|
|
1868
|
+
self._debug['_m_section_headers']['arr'] = []
|
|
1869
|
+
self._debug['_m_section_headers']['arr'].append({'start': self._io.pos()})
|
|
1870
|
+
self._raw__m_section_headers[i] = self._io.read_bytes(self.section_header_entry_size)
|
|
1871
|
+
_io__raw__m_section_headers = KaitaiStream(BytesIO(self._raw__m_section_headers[i]))
|
|
1872
|
+
_t__m_section_headers = Elf.EndianElf.SectionHeader(_io__raw__m_section_headers, self, self._root, self._is_le)
|
|
1873
|
+
_t__m_section_headers._read()
|
|
1874
|
+
self._m_section_headers[i] = _t__m_section_headers
|
|
1875
|
+
self._debug['_m_section_headers']['arr'][i]['end'] = self._io.pos()
|
|
1876
|
+
|
|
1877
|
+
else:
|
|
1878
|
+
self._raw__m_section_headers = [None] * (self.qty_section_header)
|
|
1879
|
+
self._m_section_headers = [None] * (self.qty_section_header)
|
|
1880
|
+
for i in range(self.qty_section_header):
|
|
1881
|
+
if not 'arr' in self._debug['_m_section_headers']:
|
|
1882
|
+
self._debug['_m_section_headers']['arr'] = []
|
|
1883
|
+
self._debug['_m_section_headers']['arr'].append({'start': self._io.pos()})
|
|
1884
|
+
self._raw__m_section_headers[i] = self._io.read_bytes(self.section_header_entry_size)
|
|
1885
|
+
_io__raw__m_section_headers = KaitaiStream(BytesIO(self._raw__m_section_headers[i]))
|
|
1886
|
+
_t__m_section_headers = Elf.EndianElf.SectionHeader(_io__raw__m_section_headers, self, self._root, self._is_le)
|
|
1887
|
+
_t__m_section_headers._read()
|
|
1888
|
+
self._m_section_headers[i] = _t__m_section_headers
|
|
1889
|
+
self._debug['_m_section_headers']['arr'][i]['end'] = self._io.pos()
|
|
1890
|
+
|
|
1891
|
+
self._debug['_m_section_headers']['end'] = self._io.pos()
|
|
1892
|
+
self._io.seek(_pos)
|
|
1893
|
+
return self._m_section_headers if hasattr(self, '_m_section_headers') else None
|
|
1894
|
+
|
|
1895
|
+
@property
|
|
1896
|
+
def section_names(self):
|
|
1897
|
+
if hasattr(self, '_m_section_names'):
|
|
1898
|
+
return self._m_section_names if hasattr(self, '_m_section_names') else None
|
|
1899
|
+
|
|
1900
|
+
if ((self.section_names_idx != Elf.SectionHeaderIdxSpecial.undefined.value) and (self.section_names_idx < self._root.header.qty_section_header)) :
|
|
1901
|
+
_pos = self._io.pos()
|
|
1902
|
+
self._io.seek(self.section_headers[self.section_names_idx].ofs_body)
|
|
1903
|
+
self._debug['_m_section_names']['start'] = self._io.pos()
|
|
1904
|
+
if self._is_le:
|
|
1905
|
+
self._raw__m_section_names = self._io.read_bytes(self.section_headers[self.section_names_idx].len_body)
|
|
1906
|
+
_io__raw__m_section_names = KaitaiStream(BytesIO(self._raw__m_section_names))
|
|
1907
|
+
self._m_section_names = Elf.EndianElf.StringsStruct(_io__raw__m_section_names, self, self._root, self._is_le)
|
|
1908
|
+
self._m_section_names._read()
|
|
1909
|
+
else:
|
|
1910
|
+
self._raw__m_section_names = self._io.read_bytes(self.section_headers[self.section_names_idx].len_body)
|
|
1911
|
+
_io__raw__m_section_names = KaitaiStream(BytesIO(self._raw__m_section_names))
|
|
1912
|
+
self._m_section_names = Elf.EndianElf.StringsStruct(_io__raw__m_section_names, self, self._root, self._is_le)
|
|
1913
|
+
self._m_section_names._read()
|
|
1914
|
+
self._debug['_m_section_names']['end'] = self._io.pos()
|
|
1915
|
+
self._io.seek(_pos)
|
|
1916
|
+
|
|
1917
|
+
return self._m_section_names if hasattr(self, '_m_section_names') else None
|
|
1918
|
+
|
|
1919
|
+
|
|
1920
|
+
class DtFlag1Values(KaitaiStruct):
|
|
1921
|
+
SEQ_FIELDS = []
|
|
1922
|
+
def __init__(self, value, _io, _parent=None, _root=None):
|
|
1923
|
+
self._io = _io
|
|
1924
|
+
self._parent = _parent
|
|
1925
|
+
self._root = _root if _root else self
|
|
1926
|
+
self.value = value
|
|
1927
|
+
self._debug = collections.defaultdict(dict)
|
|
1928
|
+
|
|
1929
|
+
def _read(self):
|
|
1930
|
+
pass
|
|
1931
|
+
|
|
1932
|
+
@property
|
|
1933
|
+
def singleton(self):
|
|
1934
|
+
"""Singleton symbols are used."""
|
|
1935
|
+
if hasattr(self, '_m_singleton'):
|
|
1936
|
+
return self._m_singleton if hasattr(self, '_m_singleton') else None
|
|
1937
|
+
|
|
1938
|
+
self._m_singleton = (self.value & 33554432) != 0
|
|
1939
|
+
return self._m_singleton if hasattr(self, '_m_singleton') else None
|
|
1940
|
+
|
|
1941
|
+
@property
|
|
1942
|
+
def ignmuldef(self):
|
|
1943
|
+
if hasattr(self, '_m_ignmuldef'):
|
|
1944
|
+
return self._m_ignmuldef if hasattr(self, '_m_ignmuldef') else None
|
|
1945
|
+
|
|
1946
|
+
self._m_ignmuldef = (self.value & 262144) != 0
|
|
1947
|
+
return self._m_ignmuldef if hasattr(self, '_m_ignmuldef') else None
|
|
1948
|
+
|
|
1949
|
+
@property
|
|
1950
|
+
def loadfltr(self):
|
|
1951
|
+
"""Trigger filtee loading at runtime."""
|
|
1952
|
+
if hasattr(self, '_m_loadfltr'):
|
|
1953
|
+
return self._m_loadfltr if hasattr(self, '_m_loadfltr') else None
|
|
1954
|
+
|
|
1955
|
+
self._m_loadfltr = (self.value & 16) != 0
|
|
1956
|
+
return self._m_loadfltr if hasattr(self, '_m_loadfltr') else None
|
|
1957
|
+
|
|
1958
|
+
@property
|
|
1959
|
+
def initfirst(self):
|
|
1960
|
+
"""Set RTLD_INITFIRST for this object."""
|
|
1961
|
+
if hasattr(self, '_m_initfirst'):
|
|
1962
|
+
return self._m_initfirst if hasattr(self, '_m_initfirst') else None
|
|
1963
|
+
|
|
1964
|
+
self._m_initfirst = (self.value & 32) != 0
|
|
1965
|
+
return self._m_initfirst if hasattr(self, '_m_initfirst') else None
|
|
1966
|
+
|
|
1967
|
+
@property
|
|
1968
|
+
def symintpose(self):
|
|
1969
|
+
"""Object has individual interposers."""
|
|
1970
|
+
if hasattr(self, '_m_symintpose'):
|
|
1971
|
+
return self._m_symintpose if hasattr(self, '_m_symintpose') else None
|
|
1972
|
+
|
|
1973
|
+
self._m_symintpose = (self.value & 8388608) != 0
|
|
1974
|
+
return self._m_symintpose if hasattr(self, '_m_symintpose') else None
|
|
1975
|
+
|
|
1976
|
+
@property
|
|
1977
|
+
def noreloc(self):
|
|
1978
|
+
if hasattr(self, '_m_noreloc'):
|
|
1979
|
+
return self._m_noreloc if hasattr(self, '_m_noreloc') else None
|
|
1980
|
+
|
|
1981
|
+
self._m_noreloc = (self.value & 4194304) != 0
|
|
1982
|
+
return self._m_noreloc if hasattr(self, '_m_noreloc') else None
|
|
1983
|
+
|
|
1984
|
+
@property
|
|
1985
|
+
def confalt(self):
|
|
1986
|
+
"""Configuration alternative created."""
|
|
1987
|
+
if hasattr(self, '_m_confalt'):
|
|
1988
|
+
return self._m_confalt if hasattr(self, '_m_confalt') else None
|
|
1989
|
+
|
|
1990
|
+
self._m_confalt = (self.value & 8192) != 0
|
|
1991
|
+
return self._m_confalt if hasattr(self, '_m_confalt') else None
|
|
1992
|
+
|
|
1993
|
+
@property
|
|
1994
|
+
def dispreldne(self):
|
|
1995
|
+
"""Disp reloc applied at build time."""
|
|
1996
|
+
if hasattr(self, '_m_dispreldne'):
|
|
1997
|
+
return self._m_dispreldne if hasattr(self, '_m_dispreldne') else None
|
|
1998
|
+
|
|
1999
|
+
self._m_dispreldne = (self.value & 32768) != 0
|
|
2000
|
+
return self._m_dispreldne if hasattr(self, '_m_dispreldne') else None
|
|
2001
|
+
|
|
2002
|
+
@property
|
|
2003
|
+
def rtld_global(self):
|
|
2004
|
+
"""Set RTLD_GLOBAL for this object."""
|
|
2005
|
+
if hasattr(self, '_m_rtld_global'):
|
|
2006
|
+
return self._m_rtld_global if hasattr(self, '_m_rtld_global') else None
|
|
2007
|
+
|
|
2008
|
+
self._m_rtld_global = (self.value & 2) != 0
|
|
2009
|
+
return self._m_rtld_global if hasattr(self, '_m_rtld_global') else None
|
|
2010
|
+
|
|
2011
|
+
@property
|
|
2012
|
+
def nodelete(self):
|
|
2013
|
+
"""Set RTLD_NODELETE for this object."""
|
|
2014
|
+
if hasattr(self, '_m_nodelete'):
|
|
2015
|
+
return self._m_nodelete if hasattr(self, '_m_nodelete') else None
|
|
2016
|
+
|
|
2017
|
+
self._m_nodelete = (self.value & 8) != 0
|
|
2018
|
+
return self._m_nodelete if hasattr(self, '_m_nodelete') else None
|
|
2019
|
+
|
|
2020
|
+
@property
|
|
2021
|
+
def trans(self):
|
|
2022
|
+
if hasattr(self, '_m_trans'):
|
|
2023
|
+
return self._m_trans if hasattr(self, '_m_trans') else None
|
|
2024
|
+
|
|
2025
|
+
self._m_trans = (self.value & 512) != 0
|
|
2026
|
+
return self._m_trans if hasattr(self, '_m_trans') else None
|
|
2027
|
+
|
|
2028
|
+
@property
|
|
2029
|
+
def origin(self):
|
|
2030
|
+
"""$ORIGIN must be handled."""
|
|
2031
|
+
if hasattr(self, '_m_origin'):
|
|
2032
|
+
return self._m_origin if hasattr(self, '_m_origin') else None
|
|
2033
|
+
|
|
2034
|
+
self._m_origin = (self.value & 128) != 0
|
|
2035
|
+
return self._m_origin if hasattr(self, '_m_origin') else None
|
|
2036
|
+
|
|
2037
|
+
@property
|
|
2038
|
+
def now(self):
|
|
2039
|
+
"""Set RTLD_NOW for this object."""
|
|
2040
|
+
if hasattr(self, '_m_now'):
|
|
2041
|
+
return self._m_now if hasattr(self, '_m_now') else None
|
|
2042
|
+
|
|
2043
|
+
self._m_now = (self.value & 1) != 0
|
|
2044
|
+
return self._m_now if hasattr(self, '_m_now') else None
|
|
2045
|
+
|
|
2046
|
+
@property
|
|
2047
|
+
def nohdr(self):
|
|
2048
|
+
if hasattr(self, '_m_nohdr'):
|
|
2049
|
+
return self._m_nohdr if hasattr(self, '_m_nohdr') else None
|
|
2050
|
+
|
|
2051
|
+
self._m_nohdr = (self.value & 1048576) != 0
|
|
2052
|
+
return self._m_nohdr if hasattr(self, '_m_nohdr') else None
|
|
2053
|
+
|
|
2054
|
+
@property
|
|
2055
|
+
def endfiltee(self):
|
|
2056
|
+
"""Filtee terminates filters search."""
|
|
2057
|
+
if hasattr(self, '_m_endfiltee'):
|
|
2058
|
+
return self._m_endfiltee if hasattr(self, '_m_endfiltee') else None
|
|
2059
|
+
|
|
2060
|
+
self._m_endfiltee = (self.value & 16384) != 0
|
|
2061
|
+
return self._m_endfiltee if hasattr(self, '_m_endfiltee') else None
|
|
2062
|
+
|
|
2063
|
+
@property
|
|
2064
|
+
def nodirect(self):
|
|
2065
|
+
"""Object has no-direct binding."""
|
|
2066
|
+
if hasattr(self, '_m_nodirect'):
|
|
2067
|
+
return self._m_nodirect if hasattr(self, '_m_nodirect') else None
|
|
2068
|
+
|
|
2069
|
+
self._m_nodirect = (self.value & 131072) != 0
|
|
2070
|
+
return self._m_nodirect if hasattr(self, '_m_nodirect') else None
|
|
2071
|
+
|
|
2072
|
+
@property
|
|
2073
|
+
def globaudit(self):
|
|
2074
|
+
"""Global auditing required."""
|
|
2075
|
+
if hasattr(self, '_m_globaudit'):
|
|
2076
|
+
return self._m_globaudit if hasattr(self, '_m_globaudit') else None
|
|
2077
|
+
|
|
2078
|
+
self._m_globaudit = (self.value & 16777216) != 0
|
|
2079
|
+
return self._m_globaudit if hasattr(self, '_m_globaudit') else None
|
|
2080
|
+
|
|
2081
|
+
@property
|
|
2082
|
+
def noksyms(self):
|
|
2083
|
+
if hasattr(self, '_m_noksyms'):
|
|
2084
|
+
return self._m_noksyms if hasattr(self, '_m_noksyms') else None
|
|
2085
|
+
|
|
2086
|
+
self._m_noksyms = (self.value & 524288) != 0
|
|
2087
|
+
return self._m_noksyms if hasattr(self, '_m_noksyms') else None
|
|
2088
|
+
|
|
2089
|
+
@property
|
|
2090
|
+
def interpose(self):
|
|
2091
|
+
"""Object is used to interpose."""
|
|
2092
|
+
if hasattr(self, '_m_interpose'):
|
|
2093
|
+
return self._m_interpose if hasattr(self, '_m_interpose') else None
|
|
2094
|
+
|
|
2095
|
+
self._m_interpose = (self.value & 1024) != 0
|
|
2096
|
+
return self._m_interpose if hasattr(self, '_m_interpose') else None
|
|
2097
|
+
|
|
2098
|
+
@property
|
|
2099
|
+
def nodump(self):
|
|
2100
|
+
"""Object can't be dldump'ed."""
|
|
2101
|
+
if hasattr(self, '_m_nodump'):
|
|
2102
|
+
return self._m_nodump if hasattr(self, '_m_nodump') else None
|
|
2103
|
+
|
|
2104
|
+
self._m_nodump = (self.value & 4096) != 0
|
|
2105
|
+
return self._m_nodump if hasattr(self, '_m_nodump') else None
|
|
2106
|
+
|
|
2107
|
+
@property
|
|
2108
|
+
def disprelpnd(self):
|
|
2109
|
+
"""Disp reloc applied at run-time."""
|
|
2110
|
+
if hasattr(self, '_m_disprelpnd'):
|
|
2111
|
+
return self._m_disprelpnd if hasattr(self, '_m_disprelpnd') else None
|
|
2112
|
+
|
|
2113
|
+
self._m_disprelpnd = (self.value & 65536) != 0
|
|
2114
|
+
return self._m_disprelpnd if hasattr(self, '_m_disprelpnd') else None
|
|
2115
|
+
|
|
2116
|
+
@property
|
|
2117
|
+
def noopen(self):
|
|
2118
|
+
"""Set RTLD_NOOPEN for this object."""
|
|
2119
|
+
if hasattr(self, '_m_noopen'):
|
|
2120
|
+
return self._m_noopen if hasattr(self, '_m_noopen') else None
|
|
2121
|
+
|
|
2122
|
+
self._m_noopen = (self.value & 64) != 0
|
|
2123
|
+
return self._m_noopen if hasattr(self, '_m_noopen') else None
|
|
2124
|
+
|
|
2125
|
+
@property
|
|
2126
|
+
def stub(self):
|
|
2127
|
+
if hasattr(self, '_m_stub'):
|
|
2128
|
+
return self._m_stub if hasattr(self, '_m_stub') else None
|
|
2129
|
+
|
|
2130
|
+
self._m_stub = (self.value & 67108864) != 0
|
|
2131
|
+
return self._m_stub if hasattr(self, '_m_stub') else None
|
|
2132
|
+
|
|
2133
|
+
@property
|
|
2134
|
+
def direct(self):
|
|
2135
|
+
"""Direct binding enabled."""
|
|
2136
|
+
if hasattr(self, '_m_direct'):
|
|
2137
|
+
return self._m_direct if hasattr(self, '_m_direct') else None
|
|
2138
|
+
|
|
2139
|
+
self._m_direct = (self.value & 256) != 0
|
|
2140
|
+
return self._m_direct if hasattr(self, '_m_direct') else None
|
|
2141
|
+
|
|
2142
|
+
@property
|
|
2143
|
+
def edited(self):
|
|
2144
|
+
"""Object is modified after built."""
|
|
2145
|
+
if hasattr(self, '_m_edited'):
|
|
2146
|
+
return self._m_edited if hasattr(self, '_m_edited') else None
|
|
2147
|
+
|
|
2148
|
+
self._m_edited = (self.value & 2097152) != 0
|
|
2149
|
+
return self._m_edited if hasattr(self, '_m_edited') else None
|
|
2150
|
+
|
|
2151
|
+
@property
|
|
2152
|
+
def group(self):
|
|
2153
|
+
"""Set RTLD_GROUP for this object."""
|
|
2154
|
+
if hasattr(self, '_m_group'):
|
|
2155
|
+
return self._m_group if hasattr(self, '_m_group') else None
|
|
2156
|
+
|
|
2157
|
+
self._m_group = (self.value & 4) != 0
|
|
2158
|
+
return self._m_group if hasattr(self, '_m_group') else None
|
|
2159
|
+
|
|
2160
|
+
@property
|
|
2161
|
+
def pie(self):
|
|
2162
|
+
if hasattr(self, '_m_pie'):
|
|
2163
|
+
return self._m_pie if hasattr(self, '_m_pie') else None
|
|
2164
|
+
|
|
2165
|
+
self._m_pie = (self.value & 134217728) != 0
|
|
2166
|
+
return self._m_pie if hasattr(self, '_m_pie') else None
|
|
2167
|
+
|
|
2168
|
+
@property
|
|
2169
|
+
def nodeflib(self):
|
|
2170
|
+
"""Ignore default lib search path."""
|
|
2171
|
+
if hasattr(self, '_m_nodeflib'):
|
|
2172
|
+
return self._m_nodeflib if hasattr(self, '_m_nodeflib') else None
|
|
2173
|
+
|
|
2174
|
+
self._m_nodeflib = (self.value & 2048) != 0
|
|
2175
|
+
return self._m_nodeflib if hasattr(self, '_m_nodeflib') else None
|
|
2176
|
+
|
|
2177
|
+
|
|
2178
|
+
class SectionHeaderFlags(KaitaiStruct):
|
|
2179
|
+
SEQ_FIELDS = []
|
|
2180
|
+
def __init__(self, value, _io, _parent=None, _root=None):
|
|
2181
|
+
self._io = _io
|
|
2182
|
+
self._parent = _parent
|
|
2183
|
+
self._root = _root if _root else self
|
|
2184
|
+
self.value = value
|
|
2185
|
+
self._debug = collections.defaultdict(dict)
|
|
2186
|
+
|
|
2187
|
+
def _read(self):
|
|
2188
|
+
pass
|
|
2189
|
+
|
|
2190
|
+
@property
|
|
2191
|
+
def merge(self):
|
|
2192
|
+
"""might be merged."""
|
|
2193
|
+
if hasattr(self, '_m_merge'):
|
|
2194
|
+
return self._m_merge if hasattr(self, '_m_merge') else None
|
|
2195
|
+
|
|
2196
|
+
self._m_merge = (self.value & 16) != 0
|
|
2197
|
+
return self._m_merge if hasattr(self, '_m_merge') else None
|
|
2198
|
+
|
|
2199
|
+
@property
|
|
2200
|
+
def mask_os(self):
|
|
2201
|
+
"""OS-specific."""
|
|
2202
|
+
if hasattr(self, '_m_mask_os'):
|
|
2203
|
+
return self._m_mask_os if hasattr(self, '_m_mask_os') else None
|
|
2204
|
+
|
|
2205
|
+
self._m_mask_os = (self.value & 267386880) != 0
|
|
2206
|
+
return self._m_mask_os if hasattr(self, '_m_mask_os') else None
|
|
2207
|
+
|
|
2208
|
+
@property
|
|
2209
|
+
def exclude(self):
|
|
2210
|
+
"""section is excluded unless referenced or allocated (Solaris)."""
|
|
2211
|
+
if hasattr(self, '_m_exclude'):
|
|
2212
|
+
return self._m_exclude if hasattr(self, '_m_exclude') else None
|
|
2213
|
+
|
|
2214
|
+
self._m_exclude = (self.value & 134217728) != 0
|
|
2215
|
+
return self._m_exclude if hasattr(self, '_m_exclude') else None
|
|
2216
|
+
|
|
2217
|
+
@property
|
|
2218
|
+
def mask_proc(self):
|
|
2219
|
+
"""Processor-specific."""
|
|
2220
|
+
if hasattr(self, '_m_mask_proc'):
|
|
2221
|
+
return self._m_mask_proc if hasattr(self, '_m_mask_proc') else None
|
|
2222
|
+
|
|
2223
|
+
self._m_mask_proc = (self.value & 4026531840) != 0
|
|
2224
|
+
return self._m_mask_proc if hasattr(self, '_m_mask_proc') else None
|
|
2225
|
+
|
|
2226
|
+
@property
|
|
2227
|
+
def strings(self):
|
|
2228
|
+
"""contains nul-terminated strings."""
|
|
2229
|
+
if hasattr(self, '_m_strings'):
|
|
2230
|
+
return self._m_strings if hasattr(self, '_m_strings') else None
|
|
2231
|
+
|
|
2232
|
+
self._m_strings = (self.value & 32) != 0
|
|
2233
|
+
return self._m_strings if hasattr(self, '_m_strings') else None
|
|
2234
|
+
|
|
2235
|
+
@property
|
|
2236
|
+
def os_non_conforming(self):
|
|
2237
|
+
"""non-standard OS specific handling required."""
|
|
2238
|
+
if hasattr(self, '_m_os_non_conforming'):
|
|
2239
|
+
return self._m_os_non_conforming if hasattr(self, '_m_os_non_conforming') else None
|
|
2240
|
+
|
|
2241
|
+
self._m_os_non_conforming = (self.value & 256) != 0
|
|
2242
|
+
return self._m_os_non_conforming if hasattr(self, '_m_os_non_conforming') else None
|
|
2243
|
+
|
|
2244
|
+
@property
|
|
2245
|
+
def alloc(self):
|
|
2246
|
+
"""occupies memory during execution."""
|
|
2247
|
+
if hasattr(self, '_m_alloc'):
|
|
2248
|
+
return self._m_alloc if hasattr(self, '_m_alloc') else None
|
|
2249
|
+
|
|
2250
|
+
self._m_alloc = (self.value & 2) != 0
|
|
2251
|
+
return self._m_alloc if hasattr(self, '_m_alloc') else None
|
|
2252
|
+
|
|
2253
|
+
@property
|
|
2254
|
+
def exec_instr(self):
|
|
2255
|
+
"""executable."""
|
|
2256
|
+
if hasattr(self, '_m_exec_instr'):
|
|
2257
|
+
return self._m_exec_instr if hasattr(self, '_m_exec_instr') else None
|
|
2258
|
+
|
|
2259
|
+
self._m_exec_instr = (self.value & 4) != 0
|
|
2260
|
+
return self._m_exec_instr if hasattr(self, '_m_exec_instr') else None
|
|
2261
|
+
|
|
2262
|
+
@property
|
|
2263
|
+
def info_link(self):
|
|
2264
|
+
"""'sh_info' contains SHT index."""
|
|
2265
|
+
if hasattr(self, '_m_info_link'):
|
|
2266
|
+
return self._m_info_link if hasattr(self, '_m_info_link') else None
|
|
2267
|
+
|
|
2268
|
+
self._m_info_link = (self.value & 64) != 0
|
|
2269
|
+
return self._m_info_link if hasattr(self, '_m_info_link') else None
|
|
2270
|
+
|
|
2271
|
+
@property
|
|
2272
|
+
def write(self):
|
|
2273
|
+
"""writable."""
|
|
2274
|
+
if hasattr(self, '_m_write'):
|
|
2275
|
+
return self._m_write if hasattr(self, '_m_write') else None
|
|
2276
|
+
|
|
2277
|
+
self._m_write = (self.value & 1) != 0
|
|
2278
|
+
return self._m_write if hasattr(self, '_m_write') else None
|
|
2279
|
+
|
|
2280
|
+
@property
|
|
2281
|
+
def link_order(self):
|
|
2282
|
+
"""preserve order after combining."""
|
|
2283
|
+
if hasattr(self, '_m_link_order'):
|
|
2284
|
+
return self._m_link_order if hasattr(self, '_m_link_order') else None
|
|
2285
|
+
|
|
2286
|
+
self._m_link_order = (self.value & 128) != 0
|
|
2287
|
+
return self._m_link_order if hasattr(self, '_m_link_order') else None
|
|
2288
|
+
|
|
2289
|
+
@property
|
|
2290
|
+
def ordered(self):
|
|
2291
|
+
"""special ordering requirement (Solaris)."""
|
|
2292
|
+
if hasattr(self, '_m_ordered'):
|
|
2293
|
+
return self._m_ordered if hasattr(self, '_m_ordered') else None
|
|
2294
|
+
|
|
2295
|
+
self._m_ordered = (self.value & 67108864) != 0
|
|
2296
|
+
return self._m_ordered if hasattr(self, '_m_ordered') else None
|
|
2297
|
+
|
|
2298
|
+
@property
|
|
2299
|
+
def tls(self):
|
|
2300
|
+
"""section hold thread-local data."""
|
|
2301
|
+
if hasattr(self, '_m_tls'):
|
|
2302
|
+
return self._m_tls if hasattr(self, '_m_tls') else None
|
|
2303
|
+
|
|
2304
|
+
self._m_tls = (self.value & 1024) != 0
|
|
2305
|
+
return self._m_tls if hasattr(self, '_m_tls') else None
|
|
2306
|
+
|
|
2307
|
+
@property
|
|
2308
|
+
def group(self):
|
|
2309
|
+
"""section is member of a group."""
|
|
2310
|
+
if hasattr(self, '_m_group'):
|
|
2311
|
+
return self._m_group if hasattr(self, '_m_group') else None
|
|
2312
|
+
|
|
2313
|
+
self._m_group = (self.value & 512) != 0
|
|
2314
|
+
return self._m_group if hasattr(self, '_m_group') else None
|
|
2315
|
+
|
|
2316
|
+
|
|
2317
|
+
class PhdrTypeFlags(KaitaiStruct):
|
|
2318
|
+
SEQ_FIELDS = []
|
|
2319
|
+
def __init__(self, value, _io, _parent=None, _root=None):
|
|
2320
|
+
self._io = _io
|
|
2321
|
+
self._parent = _parent
|
|
2322
|
+
self._root = _root if _root else self
|
|
2323
|
+
self.value = value
|
|
2324
|
+
self._debug = collections.defaultdict(dict)
|
|
2325
|
+
|
|
2326
|
+
def _read(self):
|
|
2327
|
+
pass
|
|
2328
|
+
|
|
2329
|
+
@property
|
|
2330
|
+
def read(self):
|
|
2331
|
+
if hasattr(self, '_m_read'):
|
|
2332
|
+
return self._m_read if hasattr(self, '_m_read') else None
|
|
2333
|
+
|
|
2334
|
+
self._m_read = (self.value & 4) != 0
|
|
2335
|
+
return self._m_read if hasattr(self, '_m_read') else None
|
|
2336
|
+
|
|
2337
|
+
@property
|
|
2338
|
+
def write(self):
|
|
2339
|
+
if hasattr(self, '_m_write'):
|
|
2340
|
+
return self._m_write if hasattr(self, '_m_write') else None
|
|
2341
|
+
|
|
2342
|
+
self._m_write = (self.value & 2) != 0
|
|
2343
|
+
return self._m_write if hasattr(self, '_m_write') else None
|
|
2344
|
+
|
|
2345
|
+
@property
|
|
2346
|
+
def execute(self):
|
|
2347
|
+
if hasattr(self, '_m_execute'):
|
|
2348
|
+
return self._m_execute if hasattr(self, '_m_execute') else None
|
|
2349
|
+
|
|
2350
|
+
self._m_execute = (self.value & 1) != 0
|
|
2351
|
+
return self._m_execute if hasattr(self, '_m_execute') else None
|
|
2352
|
+
|
|
2353
|
+
@property
|
|
2354
|
+
def mask_proc(self):
|
|
2355
|
+
if hasattr(self, '_m_mask_proc'):
|
|
2356
|
+
return self._m_mask_proc if hasattr(self, '_m_mask_proc') else None
|
|
2357
|
+
|
|
2358
|
+
self._m_mask_proc = (self.value & 4026531840) != 0
|
|
2359
|
+
return self._m_mask_proc if hasattr(self, '_m_mask_proc') else None
|
|
2360
|
+
|
|
2361
|
+
|
|
2362
|
+
class DtFlagValues(KaitaiStruct):
|
|
2363
|
+
"""
|
|
2364
|
+
.. seealso::
|
|
2365
|
+
Figure 5-11: DT_FLAGS values - https://refspecs.linuxbase.org/elf/gabi4+/ch5.dynamic.html
|
|
2366
|
+
|
|
2367
|
+
|
|
2368
|
+
.. seealso::
|
|
2369
|
+
Source - https://github.com/golang/go/blob/48dfddbab3/src/debug/elf/elf.go#L1079-L1095
|
|
2370
|
+
|
|
2371
|
+
|
|
2372
|
+
.. seealso::
|
|
2373
|
+
Source - https://docs.oracle.com/en/operating-systems/solaris/oracle-solaris/11.4/linkers-libraries/dynamic-section.html#GUID-4336A69A-D905-4FCE-A398-80375A9E6464__CHAPTER7-TBL-5
|
|
2374
|
+
"""
|
|
2375
|
+
SEQ_FIELDS = []
|
|
2376
|
+
def __init__(self, value, _io, _parent=None, _root=None):
|
|
2377
|
+
self._io = _io
|
|
2378
|
+
self._parent = _parent
|
|
2379
|
+
self._root = _root if _root else self
|
|
2380
|
+
self.value = value
|
|
2381
|
+
self._debug = collections.defaultdict(dict)
|
|
2382
|
+
|
|
2383
|
+
def _read(self):
|
|
2384
|
+
pass
|
|
2385
|
+
|
|
2386
|
+
@property
|
|
2387
|
+
def bind_now(self):
|
|
2388
|
+
"""all relocations for this object must be processed before returning
|
|
2389
|
+
control to the program
|
|
2390
|
+
"""
|
|
2391
|
+
if hasattr(self, '_m_bind_now'):
|
|
2392
|
+
return self._m_bind_now if hasattr(self, '_m_bind_now') else None
|
|
2393
|
+
|
|
2394
|
+
self._m_bind_now = (self.value & 8) != 0
|
|
2395
|
+
return self._m_bind_now if hasattr(self, '_m_bind_now') else None
|
|
2396
|
+
|
|
2397
|
+
@property
|
|
2398
|
+
def origin(self):
|
|
2399
|
+
"""object may reference the $ORIGIN substitution string."""
|
|
2400
|
+
if hasattr(self, '_m_origin'):
|
|
2401
|
+
return self._m_origin if hasattr(self, '_m_origin') else None
|
|
2402
|
+
|
|
2403
|
+
self._m_origin = (self.value & 1) != 0
|
|
2404
|
+
return self._m_origin if hasattr(self, '_m_origin') else None
|
|
2405
|
+
|
|
2406
|
+
@property
|
|
2407
|
+
def textrel(self):
|
|
2408
|
+
"""relocation entries might request modifications to a non-writable segment."""
|
|
2409
|
+
if hasattr(self, '_m_textrel'):
|
|
2410
|
+
return self._m_textrel if hasattr(self, '_m_textrel') else None
|
|
2411
|
+
|
|
2412
|
+
self._m_textrel = (self.value & 4) != 0
|
|
2413
|
+
return self._m_textrel if hasattr(self, '_m_textrel') else None
|
|
2414
|
+
|
|
2415
|
+
@property
|
|
2416
|
+
def static_tls(self):
|
|
2417
|
+
"""object uses static thread-local storage scheme."""
|
|
2418
|
+
if hasattr(self, '_m_static_tls'):
|
|
2419
|
+
return self._m_static_tls if hasattr(self, '_m_static_tls') else None
|
|
2420
|
+
|
|
2421
|
+
self._m_static_tls = (self.value & 16) != 0
|
|
2422
|
+
return self._m_static_tls if hasattr(self, '_m_static_tls') else None
|
|
2423
|
+
|
|
2424
|
+
@property
|
|
2425
|
+
def symbolic(self):
|
|
2426
|
+
"""symbolic linking."""
|
|
2427
|
+
if hasattr(self, '_m_symbolic'):
|
|
2428
|
+
return self._m_symbolic if hasattr(self, '_m_symbolic') else None
|
|
2429
|
+
|
|
2430
|
+
self._m_symbolic = (self.value & 2) != 0
|
|
2431
|
+
return self._m_symbolic if hasattr(self, '_m_symbolic') else None
|
|
2432
|
+
|
|
2433
|
+
|
|
2434
|
+
@property
|
|
2435
|
+
def sh_idx_lo_os(self):
|
|
2436
|
+
if hasattr(self, '_m_sh_idx_lo_os'):
|
|
2437
|
+
return self._m_sh_idx_lo_os if hasattr(self, '_m_sh_idx_lo_os') else None
|
|
2438
|
+
|
|
2439
|
+
self._m_sh_idx_lo_os = 65312
|
|
2440
|
+
return self._m_sh_idx_lo_os if hasattr(self, '_m_sh_idx_lo_os') else None
|
|
2441
|
+
|
|
2442
|
+
@property
|
|
2443
|
+
def sh_idx_lo_reserved(self):
|
|
2444
|
+
if hasattr(self, '_m_sh_idx_lo_reserved'):
|
|
2445
|
+
return self._m_sh_idx_lo_reserved if hasattr(self, '_m_sh_idx_lo_reserved') else None
|
|
2446
|
+
|
|
2447
|
+
self._m_sh_idx_lo_reserved = 65280
|
|
2448
|
+
return self._m_sh_idx_lo_reserved if hasattr(self, '_m_sh_idx_lo_reserved') else None
|
|
2449
|
+
|
|
2450
|
+
@property
|
|
2451
|
+
def sh_idx_hi_proc(self):
|
|
2452
|
+
if hasattr(self, '_m_sh_idx_hi_proc'):
|
|
2453
|
+
return self._m_sh_idx_hi_proc if hasattr(self, '_m_sh_idx_hi_proc') else None
|
|
2454
|
+
|
|
2455
|
+
self._m_sh_idx_hi_proc = 65311
|
|
2456
|
+
return self._m_sh_idx_hi_proc if hasattr(self, '_m_sh_idx_hi_proc') else None
|
|
2457
|
+
|
|
2458
|
+
@property
|
|
2459
|
+
def sh_idx_lo_proc(self):
|
|
2460
|
+
if hasattr(self, '_m_sh_idx_lo_proc'):
|
|
2461
|
+
return self._m_sh_idx_lo_proc if hasattr(self, '_m_sh_idx_lo_proc') else None
|
|
2462
|
+
|
|
2463
|
+
self._m_sh_idx_lo_proc = 65280
|
|
2464
|
+
return self._m_sh_idx_lo_proc if hasattr(self, '_m_sh_idx_lo_proc') else None
|
|
2465
|
+
|
|
2466
|
+
@property
|
|
2467
|
+
def sh_idx_hi_os(self):
|
|
2468
|
+
if hasattr(self, '_m_sh_idx_hi_os'):
|
|
2469
|
+
return self._m_sh_idx_hi_os if hasattr(self, '_m_sh_idx_hi_os') else None
|
|
2470
|
+
|
|
2471
|
+
self._m_sh_idx_hi_os = 65343
|
|
2472
|
+
return self._m_sh_idx_hi_os if hasattr(self, '_m_sh_idx_hi_os') else None
|
|
2473
|
+
|
|
2474
|
+
@property
|
|
2475
|
+
def sh_idx_hi_reserved(self):
|
|
2476
|
+
if hasattr(self, '_m_sh_idx_hi_reserved'):
|
|
2477
|
+
return self._m_sh_idx_hi_reserved if hasattr(self, '_m_sh_idx_hi_reserved') else None
|
|
2478
|
+
|
|
2479
|
+
self._m_sh_idx_hi_reserved = 65535
|
|
2480
|
+
return self._m_sh_idx_hi_reserved if hasattr(self, '_m_sh_idx_hi_reserved') else None
|
|
2481
|
+
|
|
2482
|
+
|