aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorterminaldweller <devi@terminaldweller.com>2024-06-04 21:01:16 +0000
committerterminaldweller <devi@terminaldweller.com>2024-06-04 21:01:16 +0000
commit9a125f6be1704e804a2a7861ebc2a0890272b6db (patch)
treeda0c29e829f879d6d79b742927077c984ab65386
parentupdated the dependencies (diff)
downloaddelf-9a125f6be1704e804a2a7861ebc2a0890272b6db.tar.gz
delf-9a125f6be1704e804a2a7861ebc2a0890272b6db.zip
added a new option to remove color from output
-rw-r--r--README.md27
-rw-r--r--poetry.lock292
-rw-r--r--pyproject.toml3
-rwxr-xr-xsrc/delf.py191
-rw-r--r--test/compile_commands.json7
-rw-r--r--test/makefile35
-rw-r--r--test/test.c32
7 files changed, 372 insertions, 215 deletions
diff --git a/README.md b/README.md
index d370884..e96d310 100644
--- a/README.md
+++ b/README.md
@@ -22,21 +22,18 @@ You can then run it with `poetry shell` or `poetry run`.<br/>
## Options
-For a list of available options just run `delf -h`:<br/>
+For a list of available options just run `delf --help`:<br/>
```txt
-usage: delf [-h] [--dbg] [--obj OBJ] [--header] [--symboltable] [--phdrs]
- [--shdrs] [--symbolindex] [--stentries] [--objcode] [--test]
- [--test2] [--funcs] [--objs] [--dynsym] [--dlpath] [--phdynent]
- [--section SECTION] [--dumpfunc DUMPFUNC]
- [--dumpfuncasm DUMPFUNCASM] [--textasm] [--dynsecents] [--reladyn]
- [--relaplt] [--rodata] [--disass DISASS]
-
-optional arguments:
+$ delf --help
+usage: delf [-h] [--dbg] [--obj OBJ] [--header] [--symboltable] [--phdrs] [--shdrs] [--symbolindex] [--stentries] [--objcode] [--test] [--test2] [--listdso] [--funcs] [--objs] [--dynsym] [--dlpath] [--phdynent]
+ [--section SECTION] [--dumpfunc DUMPFUNC] [--dumpfuncasm DUMPFUNCASM] [--textasm] [--dynsecents] [--reladyn] [--relaplt] [--rodata] [--disass DISASS] [--disassp DISASSP] [--got] [--gotplt]
+ [--noclor]
+
+options:
-h, --help show this help message and exit
--dbg debug
- --obj OBJ path to the executbale, shared object or object you
- want to load in bruiser
+ --obj OBJ path to the executbale, shared object or object you want to load in bruiser
--header dump headers
--symboltable dump symbol table
--phdrs dump program haeders
@@ -46,6 +43,7 @@ optional arguments:
--objcode dump objects
--test test switch
--test2 test switch 2
+ --listdso list DSOs
--funcs dump functions
--objs dump objects
--dynsym dump dynamic symbol table
@@ -60,8 +58,11 @@ optional arguments:
--reladyn .rela.dyn entries
--relaplt .rela.plt entries
--rodata dump .rodata
- --disass DISASS disassemblt a section
-
+ --disass DISASS disassembls a section by name in section headers
+ --disassp DISASSP disassembls a section by index in program headers
+ --got dump .got section
+ --gotplt dump .got.plt section
+ --noclor dont use color
```
## Example usage
diff --git a/poetry.lock b/poetry.lock
index 1f51b04..cdfbfa8 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,6 +1,37 @@
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
[[package]]
+name = "annotated-types"
+version = "0.7.0"
+description = "Reusable constraint types to use with typing.Annotated"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
+ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
+]
+
+[[package]]
+name = "anyio"
+version = "4.4.0"
+description = "High level compatibility layer for multiple asynchronous event loop implementations"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"},
+ {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"},
+]
+
+[package.dependencies]
+idna = ">=2.8"
+sniffio = ">=1.1"
+
+[package.extras]
+doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
+test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
+trio = ["trio (>=0.23)"]
+
+[[package]]
name = "astroid"
version = "3.2.2"
description = "An abstract syntax tree for Python with inference support."
@@ -94,6 +125,17 @@ files = [
]
[[package]]
+name = "certifi"
+version = "2024.6.2"
+description = "Python package for providing Mozilla's CA Bundle."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"},
+ {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"},
+]
+
+[[package]]
name = "click"
version = "8.1.7"
description = "Composable command line interface toolkit"
@@ -134,6 +176,84 @@ graph = ["objgraph (>=1.7.2)"]
profile = ["gprof2dot (>=2022.7.29)"]
[[package]]
+name = "distro"
+version = "1.9.0"
+description = "Distro - an OS platform information API"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"},
+ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"},
+]
+
+[[package]]
+name = "h11"
+version = "0.14.0"
+description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
+ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.5"
+description = "A minimal low-level HTTP client."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"},
+ {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"},
+]
+
+[package.dependencies]
+certifi = "*"
+h11 = ">=0.13,<0.15"
+
+[package.extras]
+asyncio = ["anyio (>=4.0,<5.0)"]
+http2 = ["h2 (>=3,<5)"]
+socks = ["socksio (==1.*)"]
+trio = ["trio (>=0.22.0,<0.26.0)"]
+
+[[package]]
+name = "httpx"
+version = "0.27.0"
+description = "The next generation HTTP client."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"},
+ {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"},
+]
+
+[package.dependencies]
+anyio = "*"
+certifi = "*"
+httpcore = "==1.*"
+idna = "*"
+sniffio = "*"
+
+[package.extras]
+brotli = ["brotli", "brotlicffi"]
+cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
+http2 = ["h2 (>=3,<5)"]
+socks = ["socksio (==1.*)"]
+
+[[package]]
+name = "idna"
+version = "3.7"
+description = "Internationalized Domain Names in Applications (IDNA)"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"},
+ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
+]
+
+[[package]]
name = "isort"
version = "5.13.2"
description = "A Python utility / library to sort Python imports."
@@ -251,6 +371,29 @@ files = [
]
[[package]]
+name = "openai"
+version = "1.31.0"
+description = "The official Python library for the openai API"
+optional = false
+python-versions = ">=3.7.1"
+files = [
+ {file = "openai-1.31.0-py3-none-any.whl", hash = "sha256:82044ee3122113f2a468a1f308a8882324d09556ba5348687c535d3655ee331c"},
+ {file = "openai-1.31.0.tar.gz", hash = "sha256:54ae0625b005d6a3b895db2b8438dae1059cffff0cd262a26e9015c13a29ab06"},
+]
+
+[package.dependencies]
+anyio = ">=3.5.0,<5"
+distro = ">=1.7.0,<2"
+httpx = ">=0.23.0,<1"
+pydantic = ">=1.9.0,<3"
+sniffio = "*"
+tqdm = ">4"
+typing-extensions = ">=4.7,<5"
+
+[package.extras]
+datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
+
+[[package]]
name = "packaging"
version = "24.0"
description = "Core utilities for Python packages"
@@ -300,6 +443,116 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-
type = ["mypy (>=1.8)"]
[[package]]
+name = "pydantic"
+version = "2.7.3"
+description = "Data validation using Python type hints"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pydantic-2.7.3-py3-none-any.whl", hash = "sha256:ea91b002777bf643bb20dd717c028ec43216b24a6001a280f83877fd2655d0b4"},
+ {file = "pydantic-2.7.3.tar.gz", hash = "sha256:c46c76a40bb1296728d7a8b99aa73dd70a48c3510111ff290034f860c99c419e"},
+]
+
+[package.dependencies]
+annotated-types = ">=0.4.0"
+pydantic-core = "2.18.4"
+typing-extensions = ">=4.6.1"
+
+[package.extras]
+email = ["email-validator (>=2.0.0)"]
+
+[[package]]
+name = "pydantic-core"
+version = "2.18.4"
+description = "Core functionality for Pydantic validation and serialization"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"},
+ {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"},
+ {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"},
+ {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"},
+ {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"},
+ {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"},
+ {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"},
+ {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"},
+ {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"},
+ {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"},
+ {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"},
+ {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"},
+ {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"},
+ {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"},
+ {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"},
+ {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"},
+ {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"},
+ {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"},
+ {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"},
+ {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"},
+ {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"},
+ {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"},
+ {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"},
+ {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"},
+ {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"},
+ {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"},
+ {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"},
+ {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"},
+ {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"},
+ {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"},
+ {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"},
+ {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"},
+ {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"},
+ {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"},
+ {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"},
+]
+
+[package.dependencies]
+typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
+
+[[package]]
name = "pygments"
version = "2.18.0"
description = "Pygments is a syntax highlighting package written in Python."
@@ -458,6 +711,17 @@ testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini
testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
[[package]]
+name = "sniffio"
+version = "1.3.1"
+description = "Sniff out which async library your code is running under"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
+ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
+]
+
+[[package]]
name = "stevedore"
version = "5.2.0"
description = "Manage dynamic plugins for Python applications"
@@ -483,17 +747,37 @@ files = [
]
[[package]]
+name = "tqdm"
+version = "4.66.4"
+description = "Fast, Extensible Progress Meter"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"},
+ {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"]
+notebook = ["ipywidgets (>=6)"]
+slack = ["slack-sdk"]
+telegram = ["requests"]
+
+[[package]]
name = "typing-extensions"
-version = "4.12.0"
+version = "4.12.1"
description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false
python-versions = ">=3.8"
files = [
- {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"},
- {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"},
+ {file = "typing_extensions-4.12.1-py3-none-any.whl", hash = "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a"},
+ {file = "typing_extensions-4.12.1.tar.gz", hash = "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"},
]
[metadata]
lock-version = "2.0"
python-versions = "^3.12"
-content-hash = "44f3792468ec77f2bcddb771ef4e0b2c764f563d303ede7e73b57f29dbd303c8"
+content-hash = "d7d498122fe3199160c29d596705d07ef5f13c53082da671249ede114ca2b94f"
diff --git a/pyproject.toml b/pyproject.toml
index e46b8dd..6747372 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "delf"
-version = "0.1.5"
+version = "0.2.0"
description = "yet another elf dump tool"
authors = ["terminaldweller <devi@terminaldweller.com>"]
license = "GPL-3.0"
@@ -29,6 +29,7 @@ pylint = "^3.0.2"
bandit = "^1.7.5"
ruff = "^0.1.1"
black = ">=23.10,<25.0"
+openai = "^1.30.4"
[build-system]
requires = ["poetry-core>=1.0.0"]
diff --git a/src/delf.py b/src/delf.py
index c988098..f4b114b 100755
--- a/src/delf.py
+++ b/src/delf.py
@@ -19,10 +19,10 @@
# MA 02110-1301, USA.*/
# *****************************************************************************/
import argparse
-import code
import os
import subprocess
import sys
+import typing
from capstone import CS_ARCH_X86, CS_MODE_64, Cs
@@ -30,6 +30,8 @@ from capstone import CS_ARCH_X86, CS_MODE_64, Cs
class ELF_TYPE_SIZES:
+ """Const class that holds ELF type sizes in bytes"""
+
ELF32_HALF = 2
ELF64_HALF = 2
ELF32_WORD = 4
@@ -53,7 +55,7 @@ def SigHandler_SIGINT(signum, frame):
sys.exit(0)
-class CLIArgParser(object):
+class CLIArgParser:
def __init__(self):
parser = argparse.ArgumentParser()
parser.add_argument("--dbg", action="store_true", help="debug", default=False)
@@ -194,6 +196,12 @@ class CLIArgParser(object):
help="dump .got.plt section",
default=False,
)
+ parser.add_argument(
+ "--nocolor",
+ action="store_true",
+ help="dont use color",
+ default=False,
+ )
self.args = parser.parse_args()
if self.args.obj is None:
raise Exception(
@@ -273,16 +281,29 @@ class ELF_RELA:
self.r_addend = r_addend
-def ffs(offset, header_list, numbered, *args):
+def ffs(
+ offset,
+ header_list,
+ numbered,
+ nocolor,
+ *args,
+):
# cn = Colors.green
- ch = Colors.cyan
- cd = Colors.blue
- cb = Colors.BOLD
- ci = Colors.red
- ce = Colors.ENDC
+ if nocolor:
+ ch = ""
+ cd = ""
+ cb = ""
+ ci = ""
+ ce = ""
+ else:
+ ch = Colors.cyan
+ cd = Colors.blue
+ cb = Colors.BOLD
+ ci = Colors.red
+ ce = Colors.ENDC
max_column_width = []
- lines = []
- numbers_f = []
+ lines: typing.List[str] = []
+ numbers_f: typing.List[int] = []
dummy = []
if numbered:
@@ -1210,8 +1231,10 @@ class Symbol_Table_Entry64:
self.st_type = st_type
-class ELF(object):
- def __init__(self, so):
+class ELF:
+ """The ELF class that holds everything about the ELF file."""
+
+ def __init__(self, so, argparser):
self.so = so
self.so.seek(0, 0)
self.elfhdr = ELFHDR(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
@@ -1240,6 +1263,7 @@ class ELF(object):
self.plt_got_ents = []
self.got_ents = []
self.got_plt_ents = []
+ self.argparser = argparser
def init(self, size):
self.size = size
@@ -1420,7 +1444,7 @@ class ELF(object):
header = ["d_tag", "d_un"]
tag_list = [get_ph_dynamic_ent_tag_type(ph.d_tag) for ph in self.ph_dyn_ent]
un_list = [ph.d_un for ph in self.ph_dyn_ent]
- lines = ffs(2, header, True, tag_list, un_list)
+ lines = ffs(2, header, True, self.argparser.args.nocolor, tag_list, un_list)
for line in lines:
print(line)
@@ -1473,7 +1497,7 @@ class ELF(object):
self.dlpath = repr(obj)
count = int()
if dump:
- strrep = []
+ strrep: typing.List[str] = []
for byte in obj:
if count % 16 == 0:
for ch in strrep:
@@ -1529,6 +1553,7 @@ class ELF(object):
2,
header,
True,
+ self.argparser.args.nocoor,
name_list,
size_list,
value_list,
@@ -1551,6 +1576,7 @@ class ELF(object):
2,
header,
True,
+ self.argparser.args.noclor,
name_list,
size_list,
value_list,
@@ -1609,6 +1635,7 @@ class ELF(object):
2,
header,
True,
+ self.argparser.args.nocolor,
mag_list,
class_list,
data_list,
@@ -1661,6 +1688,7 @@ class ELF(object):
2,
header,
True,
+ self.argparser.args.nocolor,
type_list,
flags_list,
offset_list,
@@ -1706,6 +1734,7 @@ class ELF(object):
2,
header,
True,
+ self.argparser.args.nocolor,
name_list,
type_list,
flag_list,
@@ -1765,6 +1794,7 @@ class ELF(object):
2,
header,
True,
+ self.argparser.args.nocolor,
idx_list,
name_list,
value_list,
@@ -1811,6 +1841,7 @@ class ELF(object):
2,
header,
True,
+ self.argparser.args.nocolor,
idx_list,
name_list,
value_list,
@@ -1834,6 +1865,7 @@ class ELF(object):
2,
header,
True,
+ self.argparser.args.nocolor,
tag_string_list,
tag_list,
value_list,
@@ -1847,7 +1879,15 @@ class ELF(object):
r_offset_list = [entry["r_offset"] for entry in to_dump]
r_info_list = [entry["r_info"] for entry in to_dump]
addend_list = [entry["r_addend"] for entry in to_dump]
- lines = ffs(2, header, True, r_offset_list, r_info_list, addend_list)
+ lines = ffs(
+ 2,
+ header,
+ True,
+ self.argparser.args.nocolor,
+ r_offset_list,
+ r_info_list,
+ addend_list,
+ )
for line in lines:
print(line)
@@ -1855,7 +1895,9 @@ class ELF(object):
header = ["r_offset", "r_info"]
r_offset_list = [entry["r_offset"] for entry in to_dump]
r_info_list = [entry["r_info"] for entry in to_dump]
- lines = ffs(2, header, True, r_offset_list, r_info_list)
+ lines = ffs(
+ 2, header, True, self.argparser.args.nocolor, r_offset_list, r_info_list
+ )
for line in lines:
print(line)
@@ -2037,14 +2079,14 @@ class ELF(object):
def dump_got(self):
header = ["value"]
value_list = [entry for entry in self.got_ents]
- lines = ffs(2, header, True, value_list)
+ lines = ffs(2, header, True, self.argparser.args.nocolor, value_list)
for line in lines:
print(line)
def dump_got_plt(self):
header = ["value"]
value_list = [entry for entry in self.got_plt_ents]
- lines = ffs(2, header, True, value_list)
+ lines = ffs(2, header, True, self.argparser.args.nocolor, value_list)
for line in lines:
print(line)
@@ -2074,109 +2116,11 @@ def ch_exe_to_so(path):
so.close
-def elf_init():
- so = openSO_r(sys.argv[1])
- elf = ELF(so)
- elf.init(64)
-
-
-def elf_get_func_names():
- so = openSO_r(sys.argv[1])
- elf = ELF(so)
- elf.init(64)
- return elf.dump_symbol_string(ELF_ST_TYPE.STT_FUNC, False)
-
-
-def elf_get_text_section():
- so = openSO_r(sys.argv[1])
- elf = ELF(so)
- elf.init(64)
- return elf.dump_section(".text", False)
-
-
-def elf_get_section(name):
- so = openSO_r(sys.argv[1])
- elf = ELF(so)
- elf.init(64)
- return elf.dump_section(name, False)
-
-
-def elf_get_rodata_section():
- so = openSO_r(sys.argv[1])
- elf = ELF(so)
- elf.init(64)
- return elf.dump_section(".rodata", False)
-
-
-# obj here means variables or what the C standard means by objects
-
-
-def elf_get_obj_names():
- so = openSO_r(sys.argv[1])
- elf = ELF(so)
- elf.init(64)
- return elf.dump_symbol_string(ELF_ST_TYPE.STT_OBJECT, False)
-
-
-# obj here means variables or what the C standard means by objects
-
-
-def elf_get_obj_sizes():
- so = openSO_r(sys.argv[1])
- elf = ELF(so)
- elf.init(64)
- return elf.dump_obj_size(ELF_ST_TYPE.STT_OBJECT, False)
-
-
-def elf_get_func_code():
- so = openSO_r(sys.argv[1])
- elf = ELF(so)
- elf.init(64)
- return elf.dump_funcs(False)
-
-
-def elf_get_func_code_byname():
- so = openSO_r(sys.argv[1])
- arg = openSO_r(sys.argv[2])
- elf = ELF(so)
- elf.init(64)
- counter = 0
- # hit = False
- for name in elf.dump_symbol_string(ELF_ST_TYPE.STT_FUNC, False):
- if name == arg:
- code = elf.dump_funcs(False)[counter]
- # hit = True
- counter += 1
- return code
-
-
-class Call_Rewriter(object):
- # def __init__(self, obj_code, arch, mode):
- def __init__(self, obj_code):
- self.obj_code = bytes(obj_code)
- self.md = Cs(CS_ARCH_X86, CS_MODE_64)
- # self.md = Cs(arch, mode)
-
- def dumpall(self):
- for i in self.md.disasm(self.obj_code, 0x1):
- print("0x%x:\t%s\t%s" % (i.address, i.mnemonic, i.op_str))
-
- def run(self):
- for i in self.md.disasm(self.obj_code, 0x1):
- if i.mnemonic == "call":
- print("0x%x:\t%s\t%s" % (i.address, i.mnemonic, i.op_str))
- print(i.bytes)
-
-
-class Global_Rewriter(object):
- def __init__(self):
- pass
-
-
-class Rewriter(object):
- def __init__(self, path, new_name):
+class Rewriter:
+ def __init__(self, path, new_name, argparser):
so = openSO_r(path)
- self.elf = ELF(so)
+ self.argparser = argparser
+ self.elf = ELF(so, argparser)
self.elf.init(64)
# shutil.copyfile(path, "/tmp/exe")
self.magic_section_number = int()
@@ -2223,9 +2167,10 @@ class Rewriter(object):
def main() -> None:
+ """The entryp point."""
argparser = CLIArgParser()
so = openSO_r(argparser.args.obj)
- elf = ELF(so)
+ elf = ELF(so, argparser)
elf.init(64)
if argparser.args.header:
elf.dump_header()
@@ -2253,7 +2198,7 @@ def main() -> None:
elif argparser.args.section:
elf.dump_section(argparser.args.section, True)
elif argparser.args.test2:
- rewriter = Rewriter(argparser.args.obj, "new_exe")
+ rewriter = Rewriter(argparser.args.obj, "new_exe", argparser)
new_text = bytes()
rewriter.fix_section_offsets(".text", 1000, new_text)
elif argparser.args.dumpfunc:
@@ -2296,7 +2241,7 @@ def main() -> None:
index = argparser.args.disassp
# section not executable message
if byte2int(elf.phdr[index].p_flags) & 0x1 != 1:
- print("program header section is not " "executable but since you asked...")
+ print("program header section is not executable but since you asked...")
header_offset = elf.phdr[index].p_offset
header_size = elf.phdr[index].p_filesz
elf.so.seek(byte2int(header_offset))
diff --git a/test/compile_commands.json b/test/compile_commands.json
deleted file mode 100644
index ca764a6..0000000
--- a/test/compile_commands.json
+++ /dev/null
@@ -1,7 +0,0 @@
-[
- {
- "command": "cc -c -fpic -O0 -g -v --debug -o test.o test.c",
- "directory": "/home/bloodstalker/extra/delf/test",
- "file": "/home/bloodstalker/extra/delf/test/test.c"
- }
-] \ No newline at end of file
diff --git a/test/makefile b/test/makefile
deleted file mode 100644
index 9414f84..0000000
--- a/test/makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-
-##################################VARS#################################
-CC?=gcc
-CC=gcc
-CC_FLAGS=-fpic -O0 -g -v --debug
-#LD_FLAGS= -l bfd
-LD_FLAGS=
-TARGET=test
-##################################RULES################################
-.DEFAULT:all
-
-.PHONY:all clean help
-
-all:$(TARGET) $(TARGET).so $(TARGET).asm
-
-.c.o:
- $(CC) $(CC_FLAGS) -c $< -o $@
-
-$(TARGET): $(TARGET).o
- $(CC) $^ $(LD_FLAGS) -o $@
-
-$(TARGET).asm: $(TARGET).o
- objdump -r -d -M intel -S $(TARGET).o > $(TARGET).asm
-
-$(TARGET).so: $(TARGET).o
- $(CC) $^ $(LD_FLAGS) -shared -o $@
-
-clean:
- rm -f *.o *~ $(TARGET) $(TARGET).so $(TARGET).asm
-
-help:
- @echo 'all builds so and exe. all is the default.'
- @echo 'clean runs clean.'
- @echo 'help runs help.'
-
diff --git a/test/test.c b/test/test.c
deleted file mode 100644
index 00f92ad..0000000
--- a/test/test.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include "stdio.h"
-
-int myfunc1(void) {return 1;}
-int myfunc2(void) {return 2;}
-int myfunc3(void) {return 3;}
-int myfunc4(void) {return 4;}
-int myfunc5(void) {return 5;}
-int myfunc6(void) {return 6;}
-int add2(int a, int b) {return a + b;}
-int sub2(int a, int b) {return a - b;}
-double adddouble(double a, double b) {return a+b;}
-double subdouble(double a, double b) {return a-b;}
-double triple(double a, double b, double c) {return a+b+c;}
-int quad(int a, int b, int c, int d) {return add2(a,b) + add2(c,d);}
-const char* passthrough(const char* a) {return a;}
-void ext_1(void) {printf("%s", "hey there sleepy-head.\n");}
-
-int myvar1 = 1;
-int myvar2 = 2;
-int myvar3 = 3;
-int myvar4 = 4;
-
-int glob(void) {return myvar1+myvar2+myvar3+myvar4;}
-
-int main(int argc, char** argv) {
- int sum;
- sum = add2(10, 20);
- printf("i live!\n");
- int res = sub2(20, 10);
- ext_1();
- return quad(1,2,3,4);
-}