Generate Python ctypes bindings from shared libraries
Project description
dwarfbind
Generate Python ctypes bindings from shared libraries.
A tool to help generate Python ctypes bindings from shared libraries. It reads DWARF debug information from library files to understand C structures and types, then generates equivalent Python classes.
Features
- Reads DWARF debug information to understand C types and structures
- Generates Python ctypes classes that match the C structures
- Handles complex type relationships and dependencies
- Creates proper Python modules with types, symbols, and constants submodules
- Provides clean imports like
from mylib.types import MyStruct - Extracts constants and macros from header files
- Automatically discovers library paths using pkg-config
- Supports relative header paths (e.g.,
freerdp/freerdp.hwith-I /usr/include/freerdp3)
Requirements
- Python 3.12 or newer
- Debug symbols for the libraries you want to analyze:
# Install debug symbols for a specific package sudo dnf debuginfo-install libfreerdp3 # Or enable debuginfo repos and install manually sudo dnf install 'dnf-command(debuginfo-install)' sudo dnf debuginfo-install libfreerdp3
- C preprocessor (cpp) for header file analysis:
# Install gcc which includes cpp sudo dnf install gcc
- pkg-config for library and include path discovery:
# Install pkg-config sudo dnf install pkgconf-pkg-config
Installation
Usage
Generate bindings for a shared library:
# Basic usage
dwarfbind /usr/lib/libexample.so
# Extract constants from headers
dwarfbind --headers example.h /usr/lib/libexample.so
# Add include paths for header processing
dwarfbind -I /usr/include -I /usr/local/include --headers example.h /usr/lib/libexample.so
# Specify output file
dwarfbind -o bindings.py /usr/lib/libexample.so
# Process multiple libraries at once
dwarfbind -o output/ libone.so libtwo.so
# Use pkg-config to find library and include paths
dwarfbind --pkgconfig freerdp3 --headers freerdp/freerdp.h
# Enable verbose output
dwarfbind -v /usr/lib/libexample.so
The generated bindings provide a clean Python API:
from ctypes import *
from example.types import MyStruct
from example.symbols import my_function
from example.constants import BUFFER_SIZE
# Create and use structures
structure = MyStruct()
structure.field = BUFFER_SIZE
# Call library functions
my_function.argtypes = [POINTER(MyStruct)]
my_function.restype = c_int
result = my_function(byref(structure))
Development
To set up a development environment:
# Install Python 3.12 or newer
uv python install 3.12
# Optional: install shims for python/python3
uv python install --default
# Create a virtual environment
uv venv -p 3.12
# Optional: activate the environment
source .venv/bin/activate
# Sync dependencies (including dev tools)
uv sync
# Run tests
uv run pytest
Contributing
Contributions are welcome! Please feel free to submit a Pull Request. See CONTRIBUTING.md for development setup, workflow guidelines, and coding style.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dwarfbind-0.1.4.tar.gz.
File metadata
- Download URL: dwarfbind-0.1.4.tar.gz
- Upload date:
- Size: 63.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.8.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd2a0337e90e52d3ceb2ccfb907556cee6048413c0934a60a33b9e13f4943caf
|
|
| MD5 |
ec0cdb4c4e2126810cc15f2ca8f8c168
|
|
| BLAKE2b-256 |
8d9b2f495aac38dcaa9129e8e4cd6c526544995069d246a9fea52773f4f9fab8
|
File details
Details for the file dwarfbind-0.1.4-py3-none-any.whl.
File metadata
- Download URL: dwarfbind-0.1.4-py3-none-any.whl
- Upload date:
- Size: 45.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.8.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48970675f0cec64d163bd4bcb962e8887fa1f0a0a34f4fc9601fb42af33fe334
|
|
| MD5 |
b2a554f10533e8a6f9d51a86ff61e353
|
|
| BLAKE2b-256 |
18e1286960b2a2e97938a648d4eb85095ba3936710a27ef676f318e463645a95
|