edb-debugger/ 0000755 0001750 0001750 00000000000 13765535721 012726 5 ustar eteran eteran edb-debugger/libPE/ 0000755 0001750 0001750 00000000000 13765535463 013724 5 ustar eteran eteran edb-debugger/libPE/CMakeLists.txt 0000644 0001750 0001750 00000000350 13765535463 016462 0 ustar eteran eteran cmake_minimum_required(VERSION 3.1)
add_library(PE INTERFACE
)
target_include_directories(PE
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_sources(PE INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/include/libPE/pe_binary.h
)
edb-debugger/libPE/include/ 0000755 0001750 0001750 00000000000 13765535463 015347 5 ustar eteran eteran edb-debugger/libPE/include/libPE/ 0000755 0001750 0001750 00000000000 13765535463 016342 5 ustar eteran eteran edb-debugger/libPE/include/libPE/pe_binary.h 0000644 0001750 0001750 00000010047 13765535463 020465 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef PE_BINARY_H_20121007_
#define PE_BINARY_H_20121007_
#include
#ifdef WIN32
#include
#else
using BYTE = uint8_t;
using BOOLEAN = uint8_t;
using SHORT = int16_t;
using WORD = uint16_t;
using USHORT = uint16_t;
using INT = int32_t;
using LONG = int32_t;
using DWORD = uint32_t;
using ULONG = uint32_t;
using UINT = uint32_t;
using ULONGLONG = uint64_t;
using LONGLONG = int64_t;
constexpr int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
#endif
namespace libPE {
struct IMAGE_DOS_HEADER {
WORD e_magic; // "MZ"
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew;
};
struct IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
};
struct IMAGE_OPTIONAL_HEADER64 {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
ULONGLONG ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
ULONGLONG SizeOfStackReserve;
ULONGLONG SizeOfStackCommit;
ULONGLONG SizeOfHeapReserve;
ULONGLONG SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
};
struct IMAGE_OPTIONAL_HEADER32 {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
};
struct IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
};
struct IMAGE_NT_HEADERS32 {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
};
struct IMAGE_NT_HEADERS64 {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
};
}
#endif
edb-debugger/edb.1 0000644 0001750 0001750 00000003474 13765535463 013555 0 ustar eteran eteran .\"Text automatically generated by txt2man
.TH EDB 1 "December 2011" "" ""
.SH NAME
\fBedb \fP- graphical debugger and disassembler for executables
.SH SYNOPSIS
.nf
.fam C
\fBedb\fP [OPTION]\.\.\. [\fITARGET\fP]
.fam T
.fi
.fam T
.fi
.SH DESCRIPTION
\fBedb\fP (Evan's Debugger) is a modular and modern disassembler and debugger for
binary ELF files based on ptrace API and the capstone disassembly library.
.TP
.B
\fB--help\fP
Show usage and exit.
.TP
.B
\fB--symbols\fP
generate symbols map for file
.TP
.B
\fB--attach\fP
attach the process of PID to debugger
.TP
.B
\fB--run\fP [args\.\.\.]
open in debugger with optional [args\.\.\.]
.TP
.B
\fB--version\fP
show version string and exit.
.TP
.B
\fB--dump-version\fP
show version and exit.
.SH EXAMPLE
\fBedb\fP \fB--symbols\fP /lib/libc.so.6 > libc.so.6.map
.PP
.nf
.fam C
Will generate symbols for libc and save it in a text file. It's useful if you store this map files in the symbols directory configured in edb's preferences.
.fam T
.fi
for i in $(ls /lib); do \fBedb\fP \fB--symbols\fP $i > $(basename $i).map; done
.PP
.nf
.fam C
Useful to generate maps for all libs you have in /lib.
.fam T
.fi
\fBedb\fP \fB--run\fP /bin/ls
.PP
.nf
.fam C
Will open the ls program binary in debugger.
.fam T
.fi
\fBedb\fP \fB--attach\fP 1720
.PP
.nf
.fam C
Attach the process of PID 1720 to debugger.
.fam T
.fi
.SH AUTHOR
Written by Evan Teran
.SH REPORTING BUGS
Report any bugs or requests for features via BTS on https://github.com/eteran/edb-debugger/issues
.SH COPYRIGHT
Copyright © 2008 CodeF00. Licensed GPLv2: GNU GPL version 2 . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
edb-debugger/appveyor.yml 0000644 0001750 0001750 00000003367 13765535463 015332 0 ustar eteran eteran version: "{build}"
environment:
CAPSTONE_SDK: C:\capstone\sdk
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
BOOST_INCLUDEDIR: C:\Libraries\boost_1_64_0
CAPSTONE_ARCHIVE: capstone-3.0.5-rc2-win64
CMAKE_GENERATOR: Visual Studio 15 2017 Win64
QT_BASEDIR: C:\Qt\5.9\msvc2017_64
configuration:
- Debug
- Release
install:
- ps: new-item -itemtype directory -path C:\capstone\sdk | out-null
- ps: new-item -itemtype directory -path C:\capstone\sdk\include\capstone | out-null
- ps: new-item -itemtype directory -path C:\capstone\sdk\lib | out-null
- ps: "[Environment]::CurrentDirectory = 'C:\\capstone'"
- ps: (new-object net.webclient).DownloadFile("https://github.com/aquynh/capstone/releases/download/3.0.5-rc2/${env:CAPSTONE_ARCHIVE}.zip", 'capstone.zip')
- ps: expand-archive C:\capstone\capstone.zip -destinationpath C:\capstone
- ps: copy-item C:\capstone\${env:CAPSTONE_ARCHIVE}\include\*.h C:\capstone\sdk\include\capstone
- ps: copy-item C:\capstone\${env:CAPSTONE_ARCHIVE}\capstone.lib C:\capstone\sdk\lib\capstone_dll.lib
before_build:
- cmd: git submodule update --init
- cmd: cd C:\projects
- cmd: md build
- cmd: cd build
- cmd: cmake -Wno-dev -G "%CMAKE_GENERATOR%" -DCMAKE_BUILD_TYPE=%configuration% -DCMAKE_INSTALL_PREFIX=C:\projects\install -DBOOST_INCLUDEDIR="%BOOST_INCLUDEDIR%" -DCAPSTONE_SDK="%CAPSTONE_SDK%" -DQt5Core_DIR="%QT_BASEDIR%\lib\cmake\Qt5Core" -DQt5_DIR="%QT_BASEDIR%\lib\cmake\Qt5" ..\edb-debugger
build_script:
- cmd: msbuild C:\projects\build\edb.sln /t:edb /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
- cmd: msbuild C:\projects\build\edb.sln /t:DebuggerCore /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
edb-debugger/BUGS 0000644 0001750 0001750 00000000145 13765535463 013414 0 ustar eteran eteran This file has been superseded by the issue tracker at: https://github.com/eteran/edb-debugger/issues
edb-debugger/libELF/ 0000755 0001750 0001750 00000000000 13765535463 014026 5 ustar eteran eteran edb-debugger/libELF/CMakeLists.txt 0000644 0001750 0001750 00000002242 13765535463 016566 0 ustar eteran eteran cmake_minimum_required(VERSION 3.1)
add_library(ELF INTERFACE
)
target_include_directories(ELF
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_sources(ELF INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_model.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_auxv.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_binary.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_dyn.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_header.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_move.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_nhdr.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_phdr.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_rela.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_rel.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_shdr.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_sym.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_syminfo.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_types.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_verdaux.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_verdef.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_vernaux.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libELF/elf_verneed.h
)
edb-debugger/libELF/include/ 0000755 0001750 0001750 00000000000 13765535463 015451 5 ustar eteran eteran edb-debugger/libELF/include/libELF/ 0000755 0001750 0001750 00000000000 13765535463 016546 5 ustar eteran eteran edb-debugger/libELF/include/libELF/elf_auxv.h 0000644 0001750 0001750 00000007647 13765535463 020546 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_AUXV_H_20121007_
#define ELF_AUXV_H_20121007_
#include "elf_types.h"
/* Auxiliary vector. */
/* This vector is normally only used by the program interpreter. The
usual definition in an ABI supplement uses the name auxv_t. The
vector is not usually defined in a standard file, but it
can't hurt. We rename it to avoid conflicts. The sizes of these
types are an arrangement between the exec server and the program
interpreter, so we don't fully specify them here. */
struct elf32_auxv_t {
uint32_t a_type; /* Entry type */
union {
uint32_t a_val; /* Integer value */
/*
We use to have pointer elements added here. We cannot do that,
though, since it does not work when using 32-bit definitions
on 64-bit platforms and vice versa.
*/
} a_un;
};
struct elf64_auxv_t {
uint64_t a_type; /* Entry type */
union {
uint64_t a_val; /* Integer value */
/*
We use to have pointer elements added here. We cannot do that,
though, since it does not work when using 32-bit definitions
on 64-bit platforms and vice versa.
*/
} a_un;
};
// Legal values for a_type (entry type).
enum {
AT_NULL = 0, // End of vector
AT_IGNORE = 1, // Entry should be ignored
AT_EXECFD = 2, // File descriptor of program
AT_PHDR = 3, // Program headers for program
AT_PHENT = 4, // Size of program header entry
AT_PHNUM = 5, // Number of program headers
AT_PAGESZ = 6, // System page size
AT_BASE = 7, // Base address of interpreter
AT_FLAGS = 8, // Flags
AT_ENTRY = 9, // Entry point of program
AT_NOTELF = 10, // Program is not ELF
AT_UID = 11, // Real uid
AT_EUID = 12, // Effective uid
AT_GID = 13, // Real gid
AT_EGID = 14, // Effective gid
AT_CLKTCK = 17, // Frequency of times()
// Some more special a_type values describing the hardware.
AT_PLATFORM = 15, // String identifying platform.
AT_HWCAP = 16, // Machine dependent hints about processor capabilities.
// This entry gives some information about the FPU initialization
// performed by the kernel.
AT_FPUCW = 18, // Used FPU control word.
// Cache block sizes.
AT_DCACHEBSIZE = 19, // Data cache block size.
AT_ICACHEBSIZE = 20, // Instruction cache block size.
AT_UCACHEBSIZE = 21, // Unified cache block size.
// A special ignored value for PPC, used by the kernel to control the
// interpretation of the AUXV. Must be > 16.
AT_IGNOREPPC = 22, // Entry should be ignored.
AT_SECURE = 23, // Boolean, was exec setuid-like?
AT_BASE_PLATFORM = 24, // String identifying real platforms.
AT_RANDOM = 25, // Address of 16 random bytes.
AT_EXECFN = 31, // Filename of executable.
// Pointer to the global system page used for system calls and other
// nice things.
AT_SYSINFO = 32,
AT_SYSINFO_EHDR = 33,
// Shapes of the caches. Bits 0-3 contains associativity; bits 4-7 contains
// log2 of line size; mask those to get cache size.
AT_L1I_CACHESHAPE = 34,
AT_L1D_CACHESHAPE = 35,
AT_L2_CACHESHAPE = 36,
AT_L3_CACHESHAPE = 37
};
#endif
edb-debugger/libELF/include/libELF/elf_header.h 0000644 0001750 0001750 00000023050 13765535463 020775 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_HEADER_H_20121007_
#define ELF_HEADER_H_20121007_
#include "elf_types.h"
// The ELF file header. This appears at the start of every ELF file.
enum { EI_NIDENT = 16 };
/* Fields in the e_ident array. The EI_* macros are indices into the
array. The macros under each EI_* macro are the values the byte
may have. */
enum {
EI_MAG0 = 0, /* File identification byte 0 index */
EI_MAG1 = 1, /* File identification byte 1 index */
EI_MAG2 = 2, /* File identification byte 2 index */
EI_MAG3 = 3, /* File identification byte 3 index */
};
#define ELFMAG0 0x7f /* Magic number byte 0 */
#define ELFMAG1 'E' /* Magic number byte 1 */
#define ELFMAG2 'L' /* Magic number byte 2 */
#define ELFMAG3 'F' /* Magic number byte 3 */
/* Conglomeration of the identification bytes, for easy testing as a word. */
#define ELFMAG "\177ELF"
#define SELFMAG 4
enum {
EI_CLASS = 4, /* File class byte index */
ELFCLASSNONE = 0, /* Invalid class */
ELFCLASS32 = 1, /* 32-bit objects */
ELFCLASS64 = 2, /* 64-bit objects */
ELFCLASSNUM = 3,
EI_DATA = 5, /* Data encoding byte index */
ELFDATANONE = 0, /* Invalid data encoding */
ELFDATA2LSB = 1, /* 2's complement, little endian */
ELFDATA2MSB = 2, /* 2's complement, big endian */
ELFDATANUM = 3,
EI_VERSION = 6, /* File version byte index */
/* Value must be EV_CURRENT */
};
/* Legal values for e_version (version). */
enum {
EV_NONE = 0, /* Invalid ELF version */
EV_CURRENT = 1, /* Current version */
EV_NUM = 2,
};
enum {
EI_OSABI = 7, /* OS ABI identification */
ELFOSABI_NONE = 0, /* UNIX System V ABI */
ELFOSABI_SYSV = 0, /* Alias. */
ELFOSABI_HPUX = 1, /* HP-UX */
ELFOSABI_NETBSD = 2, /* NetBSD. */
ELFOSABI_GNU = 3, /* Object uses GNU ELF extensions. */
ELFOSABI_LINUX = ELFOSABI_GNU, /* Compatibility alias. */
ELFOSABI_SOLARIS = 6, /* Sun Solaris. */
ELFOSABI_AIX = 7, /* IBM AIX. */
ELFOSABI_IRIX = 8, /* SGI Irix. */
ELFOSABI_FREEBSD = 9, /* FreeBSD. */
ELFOSABI_TRU64 = 10, /* Compaq TRU64 UNIX. */
ELFOSABI_MODESTO = 11, /* Novell Modesto. */
ELFOSABI_OPENBSD = 12, /* OpenBSD. */
ELFOSABI_ARM_AEABI = 64, /* ARM EABI */
ELFOSABI_ARM = 97, /* ARM */
ELFOSABI_STANDALONE = 255, /* Standalone (embedded) application */
EI_ABIVERSION = 8, /* ABI version */
EI_PAD = 9, /* Byte index of padding bytes */
};
/* Legal values for e_type (object file type). */
enum {
ET_NONE = 0, /* No file type */
ET_REL = 1, /* Relocatable file */
ET_EXEC = 2, /* Executable file */
ET_DYN = 3, /* Shared object file */
ET_CORE = 4, /* Core file */
ET_NUM = 5, /* Number of defined types */
ET_LOOS = 0xfe00, /* OS-specific range start */
ET_HIOS = 0xfeff, /* OS-specific range end */
ET_LOPROC = 0xff00, /* Processor-specific range start */
ET_HIPROC = 0xffff, /* Processor-specific range end */
};
/* Legal values for e_machine (architecture). */
enum {
EM_NONE = 0, /* No machine */
EM_M32 = 1, /* AT&T WE 32100 */
EM_SPARC = 2, /* SUN SPARC */
EM_386 = 3, /* Intel 80386 */
EM_68K = 4, /* Motorola m68k family */
EM_88K = 5, /* Motorola m88k family */
EM_860 = 7, /* Intel 80860 */
EM_MIPS = 8, /* MIPS R3000 big-endian */
EM_S370 = 9, /* IBM System/370 */
EM_MIPS_RS3_LE = 10, /* MIPS R3000 little-endian */
EM_PARISC = 15, /* HPPA */
EM_VPP500 = 17, /* Fujitsu VPP500 */
EM_SPARC32PLUS = 18, /* Sun's "v8plus" */
EM_960 = 19, /* Intel 80960 */
EM_PPC = 20, /* PowerPC */
EM_PPC64 = 21, /* PowerPC 64-bit */
EM_S390 = 22, /* IBM S390 */
EM_V800 = 36, /* NEC V800 series */
EM_FR20 = 37, /* Fujitsu FR20 */
EM_RH32 = 38, /* TRW RH-32 */
EM_RCE = 39, /* Motorola RCE */
EM_ARM = 40, /* ARM */
EM_FAKE_ALPHA = 41, /* Digital Alpha */
EM_SH = 42, /* Hitachi SH */
EM_SPARCV9 = 43, /* SPARC v9 64-bit */
EM_TRICORE = 44, /* Siemens Tricore */
EM_ARC = 45, /* Argonaut RISC Core */
EM_H8_300 = 46, /* Hitachi H8/300 */
EM_H8_300H = 47, /* Hitachi H8/300H */
EM_H8S = 48, /* Hitachi H8S */
EM_H8_500 = 49, /* Hitachi H8/500 */
EM_IA_64 = 50, /* Intel Merced */
EM_MIPS_X = 51, /* Stanford MIPS-X */
EM_COLDFIRE = 52, /* Motorola Coldfire */
EM_68HC12 = 53, /* Motorola M68HC12 */
EM_MMA = 54, /* Fujitsu MMA Multimedia Accelerator*/
EM_PCP = 55, /* Siemens PCP */
EM_NCPU = 56, /* Sony nCPU embeeded RISC */
EM_NDR1 = 57, /* Denso NDR1 microprocessor */
EM_STARCORE = 58, /* Motorola Start*Core processor */
EM_ME16 = 59, /* Toyota ME16 processor */
EM_ST100 = 60, /* STMicroelectronic ST100 processor */
EM_TINYJ = 61, /* Advanced Logic Corp. Tinyj emb.fam*/
EM_X86_64 = 62, /* AMD x86-64 architecture */
EM_PDSP = 63, /* Sony DSP Processor */
EM_FX66 = 66, /* Siemens FX66 microcontroller */
EM_ST9PLUS = 67, /* STMicroelectronics ST9+ 8/16 mc */
EM_ST7 = 68, /* STmicroelectronics ST7 8 bit mc */
EM_68HC16 = 69, /* Motorola MC68HC16 microcontroller */
EM_68HC11 = 70, /* Motorola MC68HC11 microcontroller */
EM_68HC08 = 71, /* Motorola MC68HC08 microcontroller */
EM_68HC05 = 72, /* Motorola MC68HC05 microcontroller */
EM_SVX = 73, /* Silicon Graphics SVx */
EM_ST19 = 74, /* STMicroelectronics ST19 8 bit mc */
EM_VAX = 75, /* Digital VAX */
EM_CRIS = 76, /* Axis Communications 32-bit embedded processor */
EM_JAVELIN = 77, /* Infineon Technologies 32-bit embedded processor */
EM_FIREPATH = 78, /* Element 14 64-bit DSP Processor */
EM_ZSP = 79, /* LSI Logic 16-bit DSP Processor */
EM_MMIX = 80, /* Donald Knuth's educational 64-bit processor */
EM_HUANY = 81, /* Harvard University machine-independent object files */
EM_PRISM = 82, /* SiTera Prism */
EM_AVR = 83, /* Atmel AVR 8-bit microcontroller */
EM_FR30 = 84, /* Fujitsu FR30 */
EM_D10V = 85, /* Mitsubishi D10V */
EM_D30V = 86, /* Mitsubishi D30V */
EM_V850 = 87, /* NEC v850 */
EM_M32R = 88, /* Mitsubishi M32R */
EM_MN10300 = 89, /* Matsushita MN10300 */
EM_MN10200 = 90, /* Matsushita MN10200 */
EM_PJ = 91, /* picoJava */
EM_OPENRISC = 92, /* OpenRISC 32-bit embedded processor */
EM_ARC_A5 = 93, /* ARC Cores Tangent-A5 */
EM_XTENSA = 94, /* Tensilica Xtensa Architecture */
EM_NUM = 95,
/* If it is necessary to assign new unofficial EM_* values, please
pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
chances of collision with official or non-GNU unofficial values. */
EM_ALPHA = 0x9026,
};
struct elf32_phdr;
struct elf32_header {
using elf_phdr = elf32_phdr;
enum { ELFCLASS = ELFCLASS32 };
uint8_t e_ident[EI_NIDENT]; /* Magic number and other info */
elf32_half e_type; /* Object file type */
elf32_half e_machine; /* Architecture */
elf32_word e_version; /* Object file version */
elf32_addr e_entry; /* Entry point virtual address */
elf32_off e_phoff; /* Program header table file offset */
elf32_off e_shoff; /* Section header table file offset */
elf32_word e_flags; /* Processor-specific flags */
elf32_half e_ehsize; /* ELF header size in bytes */
elf32_half e_phentsize; /* Program header table entry size */
elf32_half e_phnum; /* Program header table entry count */
elf32_half e_shentsize; /* Section header table entry size */
elf32_half e_shnum; /* Section header table entry count */
elf32_half e_shstrndx; /* Section header string table index */
};
struct elf64_phdr;
struct elf64_header {
using elf_phdr = elf64_phdr;
enum { ELFCLASS = ELFCLASS64 };
uint8_t e_ident[EI_NIDENT]; /* Magic number and other info */
elf64_half e_type; /* Object file type */
elf64_half e_machine; /* Architecture */
elf64_word e_version; /* Object file version */
elf64_addr e_entry; /* Entry point virtual address */
elf64_off e_phoff; /* Program header table file offset */
elf64_off e_shoff; /* Section header table file offset */
elf64_word e_flags; /* Processor-specific flags */
elf64_half e_ehsize; /* ELF header size in bytes */
elf64_half e_phentsize; /* Program header table entry size */
elf64_half e_phnum; /* Program header table entry count */
elf64_half e_shentsize; /* Section header table entry size */
elf64_half e_shnum; /* Section header table entry count */
elf64_half e_shstrndx; /* Section header string table index */
};
#endif
edb-debugger/libELF/include/libELF/elf_verdaux.h 0000644 0001750 0001750 00000002344 13765535463 021226 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_VERDAUX_H_20121007_
#define ELF_VERDAUX_H_20121007_
#include "elf_types.h"
/* Auxialiary version information. */
struct elf32_verdaux {
elf32_word vda_name; /* Version or dependency names */
elf32_word vda_next; /* Offset in bytes to next verdaux entry */
};
struct elf64_verdaux {
elf64_word vda_name; /* Version or dependency names */
elf64_word vda_next; /* Offset in bytes to next verdaux entry */
};
#endif
edb-debugger/libELF/include/libELF/elf_vernaux.h 0000644 0001750 0001750 00000003230 13765535463 021233 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_VERNAUX_H_20121007_
#define ELF_VERNAUX_H_20121007_
#include "elf_types.h"
/* Auxiliary needed version information. */
struct elf32_vernaux {
elf32_word vna_hash; /* Hash value of dependency name */
elf32_half vna_flags; /* Dependency specific information */
elf32_half vna_other; /* Unused */
elf32_word vna_name; /* Dependency name string offset */
elf32_word vna_next; /* Offset in bytes to next vernaux entry */
};
struct elf64_vernaux {
elf64_word vna_hash; /* Hash value of dependency name */
elf64_half vna_flags; /* Dependency specific information */
elf64_half vna_other; /* Unused */
elf64_word vna_name; /* Dependency name string offset */
elf64_word vna_next; /* Offset in bytes to next vernaux entry */
};
/* Legal values for vna_flags. */
#if 0
enum {
VER_FLG_WEAK = 0x2 /* Weak version identifier */
};
#endif
#endif
edb-debugger/libELF/include/libELF/elf_syminfo.h 0000644 0001750 0001750 00000011406 13765535463 021233 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_SYMINFO_H_20121007_
#define ELF_SYMINFO_H_20121007_
#include "elf_types.h"
/* The syminfo section if available contains additional information about
every dynamic symbol. */
struct elf32_syminfo {
elf32_half si_boundto; /* Direct bindings, symbol bound to */
elf32_half si_flags; /* Per symbol flags */
};
struct elf64_syminfo {
elf64_half si_boundto; /* Direct bindings, symbol bound to */
elf64_half si_flags; /* Per symbol flags */
};
/* Possible values for si_boundto. */
enum {
SYMINFO_BT_SELF = 0xffff, /* Symbol bound to self */
SYMINFO_BT_PARENT = 0xfffe, /* Symbol bound to parent */
SYMINFO_BT_LOWRESERVE = 0xff00, /* Beginning of reserved entries */
};
/* Possible bitmasks for si_flags. */
enum {
SYMINFO_FLG_DIRECT = 0x0001, /* Direct bound symbol */
SYMINFO_FLG_PASSTHRU = 0x0002, /* Pass-thru symbol for translator */
SYMINFO_FLG_COPY = 0x0004, /* Symbol is a copy-reloc */
SYMINFO_FLG_LAZYLOAD = 0x0008, /* Symbol bound to object to be lazy loaded */
};
/* Syminfo version values. */
enum {
SYMINFO_NONE = 0,
SYMINFO_CURRENT = 1,
SYMINFO_NUM = 2,
};
/* How to extract and insert information held in the st_info field. */
template
constexpr auto ELF32_ST_BIND(T val) {
return static_cast(val) >> 4;
}
template
constexpr uint8_t ELF32_ST_TYPE(T val) {
return val & 0xf;
}
template
constexpr auto ELF32_ST_INFO(T1 bind, T2 type) {
return (bind << 4) + (type & 0xf);
}
/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */
template
constexpr uint8_t ELF64_ST_BIND(T val) {
return ELF32_ST_BIND(val);
}
template
constexpr uint8_t ELF64_ST_TYPE(T val) {
return ELF32_ST_TYPE(val);
}
template
constexpr auto ELF64_ST_INFO(T1 bind, T2 type) {
return ELF32_ST_INFO(bind, type);
}
/* Legal values for ST_BIND subfield of st_info (symbol binding). */
enum {
STB_LOCAL = 0, /* Local symbol */
STB_GLOBAL = 1, /* Global symbol */
STB_WEAK = 2, /* Weak symbol */
STB_NUM = 3, /* Number of defined types. */
STB_LOOS = 10, /* Start of OS-specific */
STB_GNU_UNIQUE = 10, /* Unique symbol. */
STB_HIOS = 12, /* End of OS-specific */
STB_LOPROC = 13, /* Start of processor-specific */
STB_HIPROC = 15, /* End of processor-specific */
};
/* Legal values for ST_TYPE subfield of st_info (symbol type). */
enum {
STT_NOTYPE = 0, /* Symbol type is unspecified */
STT_OBJECT = 1, /* Symbol is a data object */
STT_FUNC = 2, /* Symbol is a code object */
STT_SECTION = 3, /* Symbol associated with a section */
STT_FILE = 4, /* Symbol's name is file name */
STT_COMMON = 5, /* Symbol is a common data object */
STT_TLS = 6, /* Symbol is thread-local data object*/
STT_NUM = 7, /* Number of defined types. */
STT_LOOS = 10, /* Start of OS-specific */
STT_GNU_IFUNC = 10, /* Symbol is indirect code object */
STT_HIOS = 12, /* End of OS-specific */
STT_LOPROC = 13, /* Start of processor-specific */
STT_HIPROC = 15, /* End of processor-specific */
};
/* Symbol table indices are found in the hash buckets and chain table
of a symbol hash table section. This special index value indicates
the end of a chain, meaning no further symbols are found in that bucket. */
enum {
STN_UNDEF = 0, /* End of a chain. */
};
/* How to extract and insert information held in the st_other field. */
template
constexpr T ELF32_ST_VISIBILITY(T o) {
return ((o)&0x03);
}
/* For ELF64 the definitions are the same. */
template
constexpr T ELF64_ST_VISIBILITY(T o) {
return ELF32_ST_VISIBILITY(o);
}
/* Symbol visibility specification encoded in the st_other field. */
enum {
STV_DEFAULT = 0, /* Default symbol visibility rules */
STV_INTERNAL = 1, /* Processor specific hidden class */
STV_HIDDEN = 2, /* Sym unavailable in other modules */
STV_PROTECTED = 3, /* Not preemptible, not exported */
};
#endif
edb-debugger/libELF/include/libELF/elf_shdr.h 0000644 0001750 0001750 00000014144 13765535463 020511 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_SHDR_H_20121007_
#define ELF_SHDR_H_20121007_
#include "elf_types.h"
// Section header.
struct elf32_shdr {
elf32_word sh_name; /* Section name (string tbl index) */
elf32_word sh_type; /* Section type */
elf32_word sh_flags; /* Section flags */
elf32_addr sh_addr; /* Section virtual addr at execution */
elf32_off sh_offset; /* Section file offset */
elf32_word sh_size; /* Section size in bytes */
elf32_word sh_link; /* Link to another section */
elf32_word sh_info; /* Additional section information */
elf32_word sh_addralign; /* Section alignment */
elf32_word sh_entsize; /* Entry size if section holds table */
};
struct elf64_shdr {
elf64_word sh_name; /* Section name (string tbl index) */
elf64_word sh_type; /* Section type */
elf64_xword sh_flags; /* Section flags */
elf64_addr sh_addr; /* Section virtual addr at execution */
elf64_off sh_offset; /* Section file offset */
elf64_xword sh_size; /* Section size in bytes */
elf64_word sh_link; /* Link to another section */
elf64_word sh_info; /* Additional section information */
elf64_xword sh_addralign; /* Section alignment */
elf64_xword sh_entsize; /* Entry size if section holds table */
};
/* Special section indices. */
enum {
SHN_UNDEF = 0, /* Undefined section */
SHN_LORESERVE = 0xff00, /* Start of reserved indices */
SHN_LOPROC = 0xff00, /* Start of processor-specific */
SHN_BEFORE = 0xff00, /* Order section before all others (Solaris). */
SHN_AFTER = 0xff01, /* Order section after all others (Solaris). */
SHN_HIPROC = 0xff1f, /* End of processor-specific */
SHN_LOOS = 0xff20, /* Start of OS-specific */
SHN_HIOS = 0xff3f, /* End of OS-specific */
SHN_ABS = 0xfff1, /* Associated symbol is absolute */
SHN_COMMON = 0xfff2, /* Associated symbol is common */
SHN_XINDEX = 0xffff, /* Index is in extra table. */
SHN_HIRESERVE = 0xffff, /* End of reserved indices */
};
/* Legal values for sh_type (section type). */
enum {
SHT_NULL = 0, /* Section header table entry unused */
SHT_PROGBITS = 1, /* Program data */
SHT_SYMTAB = 2, /* Symbol table */
SHT_STRTAB = 3, /* String table */
SHT_RELA = 4, /* Relocation entries with addends */
SHT_HASH = 5, /* Symbol hash table */
SHT_DYNAMIC = 6, /* Dynamic linking information */
SHT_NOTE = 7, /* Notes */
SHT_NOBITS = 8, /* Program space with no data (bss) */
SHT_REL = 9, /* Relocation entries, no addends */
SHT_SHLIB = 10, /* Reserved */
SHT_DYNSYM = 11, /* Dynamic linker symbol table */
SHT_INIT_ARRAY = 14, /* Array of constructors */
SHT_FINI_ARRAY = 15, /* Array of destructors */
SHT_PREINIT_ARRAY = 16, /* Array of pre-constructors */
SHT_GROUP = 17, /* Section group */
SHT_SYMTAB_SHNDX = 18, /* Extended section indeces */
SHT_NUM = 19, /* Number of defined types. */
SHT_LOOS = 0x60000000, /* Start OS-specific. */
SHT_GNU_ATTRIBUTES = 0x6ffffff5, /* Object attributes. */
SHT_GNU_HASH = 0x6ffffff6, /* GNU-style hash table. */
SHT_GNU_LIBLIST = 0x6ffffff7, /* Prelink library list */
SHT_CHECKSUM = 0x6ffffff8, /* Checksum for DSO content. */
SHT_LOSUNW = 0x6ffffffa, /* Sun-specific low bound. */
SHT_SUNW_move = 0x6ffffffa,
SHT_SUNW_COMDAT = 0x6ffffffb,
SHT_SUNW_syminfo = 0x6ffffffc,
SHT_GNU_verdef = 0x6ffffffd, /* Version definition section. */
SHT_GNU_verneed = 0x6ffffffe, /* Version needs section. */
SHT_GNU_versym = 0x6fffffff, /* Version symbol table. */
SHT_HISUNW = 0x6fffffff, /* Sun-specific high bound. */
SHT_HIOS = 0x6fffffff, /* End OS-specific type */
SHT_LOPROC = 0x70000000, /* Start of processor-specific */
SHT_HIPROC = 0x7fffffff, /* End of processor-specific */
SHT_LOUSER = 0x80000000, /* Start of application-specific */
SHT_HIUSER = 0x8fffffff, /* End of application-specific */
};
/* Legal values for sh_flags (section flags). */
enum {
SHF_WRITE = (1U << 0), /* Writable */
SHF_ALLOC = (1U << 1), /* Occupies memory during execution */
SHF_EXECINSTR = (1U << 2), /* Executable */
SHF_MERGE = (1U << 4), /* Might be merged */
SHF_STRINGS = (1U << 5), /* Contains nul-terminated strings */
SHF_INFO_LINK = (1U << 6), /* `sh_info' contains SHT index */
SHF_LINK_ORDER = (1U << 7), /* Preserve order after combining */
SHF_OS_NONCONFORMING = (1U << 8), /* Non-standard OS specific handling required */
SHF_GROUP = (1U << 9), /* Section is member of a group. */
SHF_TLS = (1U << 10), /* Section hold thread-local data. */
SHF_MASKOS = 0x0ff00000, /* OS-specific. */
SHF_MASKPROC = 0xf0000000, /* Processor-specific */
SHF_ORDERED = (1U << 30), /* Special ordering requirement (Solaris). */
SHF_EXCLUDE = (1U << 31), /* Section is excluded unless referenced or allocated (Solaris).*/
};
/* Section group handling. */
enum {
GRP_COMDAT = 0x1, /* Mark group as COMDAT. */
};
#endif
edb-debugger/libELF/include/libELF/elf_sym.h 0000644 0001750 0001750 00000003001 13765535463 020347 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_SYM_H_20121007_
#define ELF_SYM_H_20121007_
#include "elf_types.h"
// Symbol table entry.
struct elf32_sym {
elf32_word st_name; // Symbol name (string tbl index)
elf32_addr st_value; // Symbol value
elf32_word st_size; // Symbol size
uint8_t st_info; // Symbol type and binding
uint8_t st_other; // Symbol visibility
elf32_section st_shndx; // Section index
};
struct elf64_sym {
elf64_word st_name; // Symbol name (string tbl index)
uint8_t st_info; // Symbol type and binding
uint8_t st_other; // Symbol visibility
elf64_section st_shndx; // Section index
elf64_addr st_value; // Symbol value
elf64_xword st_size; // Symbol size
};
#endif
edb-debugger/libELF/include/libELF/elf_move.h 0000644 0001750 0001750 00000003723 13765535463 020520 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_MOVE_H_20121007_
#define ELF_MOVE_H_20121007_
#include "elf_types.h"
// Move records.
struct elf32_move {
elf32_xword m_value; // Symbol value.
elf32_word m_info; // Size and index.
elf32_word m_poffset; // Symbol offset.
elf32_half m_repeat; // Repeat count.
elf32_half m_stride; // Stride info.
};
struct elf64_move {
elf64_xword m_value; // Symbol value.
elf64_xword m_info; // Size and index.
elf64_xword m_poffset; // Symbol offset.
elf64_half m_repeat; // Repeat count.
elf64_half m_stride; // Stride info.
};
// Macro to construct move records.
template
constexpr T ELF32_M_SYM(T info) {
return info >> 8;
}
template
constexpr auto ELF32_M_SIZE(T info) {
return static_cast(info);
}
template
constexpr auto ELF32_M_INFO(T1 sym, T2 size) {
return (sym << 8) + static_cast(size);
}
template
constexpr T ELF64_M_SYM(T info) {
return ELF32_M_SYM(info);
}
template
constexpr auto ELF64_M_SIZE(T info) {
return ELF32_M_SIZE(info);
}
template
constexpr auto ELF64_M_INFO(T1 sym, T2 size) {
return ELF32_M_INFO(sym, size);
}
#endif
edb-debugger/libELF/include/libELF/elf_rela.h 0000644 0001750 0001750 00000003601 13765535463 020470 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_RELA_H_20121007_
#define ELF_RELA_H_20121007_
#include "elf_types.h"
/* Relocation table entry with addend (in section of type SHT_RELA). */
struct elf32_rela {
elf32_addr r_offset; /* Address */
elf32_word r_info; /* Relocation type and symbol index */
elf32_sword r_addend; /* Addend */
};
struct elf64_rela {
elf64_addr r_offset; /* Address */
elf64_xword r_info; /* Relocation type and symbol index */
elf64_sxword r_addend; /* Addend */
};
/* How to extract and insert information held in the r_info field. */
template
constexpr T ELF32_R_SYM(T val) {
return val >> 8;
}
template
constexpr T ELF32_R_TYPE(T val) {
return val & 0xff;
}
template
constexpr auto ELF32_R_INFO(T1 sym, T2 type) {
return (sym << 8) + (type & 0xff);
}
template
constexpr T ELF64_R_SYM(T i) {
return i >> 32;
}
template
constexpr T ELF64_R_TYPE(T i) {
return i & 0xffffffff;
}
template
constexpr auto ELF64_R_INFO(T1 sym, T2 type) {
return (static_cast(sym) << 32) + type;
}
#endif
edb-debugger/libELF/include/libELF/elf_rel.h 0000644 0001750 0001750 00000002662 13765535463 020335 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_REL_H_20121007_
#define ELF_REL_H_20121007_
#include "elf_types.h"
// Relocation table entry without addend (in section of type SHT_REL).
struct elf32_rel {
elf32_addr r_offset; /* Address */
elf32_word r_info; /* Relocation type and symbol index */
};
/* I have seen two different definitions of the Elf64_Rel and
Elf64_Rela structures, so we'll leave them out until Novell (or
whoever) gets their act together. */
/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */
struct elf64_rel {
elf64_addr r_offset; /* Address */
elf64_xword r_info; /* Relocation type and symbol index */
};
#endif
edb-debugger/libELF/include/libELF/elf_verneed.h 0000644 0001750 0001750 00000003451 13765535463 021200 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_VERNEED_H_20121007_
#define ELF_VERNEED_H_20121007_
#include "elf_types.h"
/* Version dependency section. */
struct elf32_verneed {
elf32_half vn_version; /* Version of structure */
elf32_half vn_cnt; /* Number of associated aux entries */
elf32_word vn_file; /* Offset of filename for this dependency */
elf32_word vn_aux; /* Offset in bytes to vernaux array */
elf32_word vn_next; /* Offset in bytes to next verneed entry */
};
struct elf64_verneed {
elf64_half vn_version; /* Version of structure */
elf64_half vn_cnt; /* Number of associated aux entries */
elf64_word vn_file; /* Offset of filename for this dependency */
elf64_word vn_aux; /* Offset in bytes to vernaux array */
elf64_word vn_next; /* Offset in bytes to next verneed entry */
};
/* Legal values for vn_version (version revision). */
enum {
VER_NEED_NONE = 0, /* No version */
VER_NEED_CURRENT = 1, /* Current version */
VER_NEED_NUM = 2 /* Given version number */
};
#endif
edb-debugger/libELF/include/libELF/elf_phdr.h 0000644 0001750 0001750 00000013521 13765535463 020504 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_PHDR_H_20121007_
#define ELF_PHDR_H_20121007_
#include "elf_types.h"
/* Program segment header. */
struct elf32_phdr {
elf32_word p_type; /* Segment type */
elf32_off p_offset; /* Segment file offset */
elf32_addr p_vaddr; /* Segment virtual address */
elf32_addr p_paddr; /* Segment physical address */
elf32_word p_filesz; /* Segment size in file */
elf32_word p_memsz; /* Segment size in memory */
elf32_word p_flags; /* Segment flags */
elf32_word p_align; /* Segment alignment */
};
struct elf64_phdr {
elf64_word p_type; /* Segment type */
elf64_word p_flags; /* Segment flags */
elf64_off p_offset; /* Segment file offset */
elf64_addr p_vaddr; /* Segment virtual address */
elf64_addr p_paddr; /* Segment physical address */
elf64_xword p_filesz; /* Segment size in file */
elf64_xword p_memsz; /* Segment size in memory */
elf64_xword p_align; /* Segment alignment */
};
/* Special value for e_phnum. This indicates that the real number of
program headers is too large to fit into e_phnum. Instead the real
value is in the field sh_info of section 0. */
enum {
PN_XNUM = 0xffff,
};
/* Legal values for p_type (segment type). */
enum {
PT_NULL = 0, /* Program header table entry unused */
PT_LOAD = 1, /* Loadable program segment */
PT_DYNAMIC = 2, /* Dynamic linking information */
PT_INTERP = 3, /* Program interpreter */
PT_NOTE = 4, /* Auxiliary information */
PT_SHLIB = 5, /* Reserved */
PT_PHDR = 6, /* Entry for header table itself */
PT_TLS = 7, /* Thread-local storage segment */
PT_NUM = 8, /* Number of defined types */
PT_LOOS = 0x60000000, /* Start of OS-specific */
PT_GNU_EH_FRAME = 0x6474e550, /* GCC .eh_frame_hdr segment */
PT_GNU_STACK = 0x6474e551, /* Indicates stack executability */
PT_GNU_RELRO = 0x6474e552, /* Read-only after relocation */
PT_PAX_FLAGS = 0x65041580, /* Indicates PaX flag markings */
PT_LOSUNW = 0x6ffffffa,
PT_SUNWBSS = 0x6ffffffa, /* Sun Specific segment */
PT_SUNWSTACK = 0x6ffffffb, /* Stack segment */
PT_HISUNW = 0x6fffffff,
PT_HIOS = 0x6fffffff, /* End of OS-specific */
PT_LOPROC = 0x70000000, /* Start of processor-specific */
PT_HIPROC = 0x7fffffff, /* End of processor-specific */
};
/* Legal values for p_flags (segment flags). */
enum {
PF_X = (1 << 0), /* Segment is executable */
PF_W = (1 << 1), /* Segment is writable */
PF_R = (1 << 2), /* Segment is readable */
PF_PAGEEXEC = (1 << 4), /* Enable PAGEEXEC */
PF_NOPAGEEXEC = (1 << 5), /* Disable PAGEEXEC */
PF_SEGMEXEC = (1 << 6), /* Enable SEGMEXEC */
PF_NOSEGMEXEC = (1 << 7), /* Disable SEGMEXEC */
PF_MPROTECT = (1 << 8), /* Enable MPROTECT */
PF_NOMPROTECT = (1 << 9), /* Disable MPROTECT */
PF_RANDEXEC = (1 << 10), /* Enable RANDEXEC */
PF_NORANDEXEC = (1 << 11), /* Disable RANDEXEC */
PF_EMUTRAMP = (1 << 12), /* Enable EMUTRAMP */
PF_NOEMUTRAMP = (1 << 13), /* Disable EMUTRAMP */
PF_RANDMMAP = (1 << 14), /* Enable RANDMMAP */
PF_NORANDMMAP = (1 << 15), /* Disable RANDMMAP */
PF_MASKOS = 0x0ff00000, /* OS-specific */
PF_MASKPROC = 0xf0000000, /* Processor-specific */
};
/* Legal values for note segment descriptor types for core files. */
enum {
NT_PRSTATUS = 1, /* Contains copy of prstatus struct */
NT_FPREGSET = 2, /* Contains copy of fpregset struct */
NT_PRPSINFO = 3, /* Contains copy of prpsinfo struct */
NT_PRXREG = 4, /* Contains copy of prxregset struct */
NT_TASKSTRUCT = 4, /* Contains copy of task structure */
NT_PLATFORM = 5, /* String from sysinfo(SI_PLATFORM) */
NT_AUXV = 6, /* Contains copy of auxv array */
NT_GWINDOWS = 7, /* Contains copy of gwindows struct */
NT_ASRS = 8, /* Contains copy of asrset struct */
NT_PSTATUS = 10, /* Contains copy of pstatus struct */
NT_PSINFO = 13, /* Contains copy of psinfo struct */
NT_PRCRED = 14, /* Contains copy of prcred struct */
NT_UTSNAME = 15, /* Contains copy of utsname struct */
NT_LWPSTATUS = 16, /* Contains copy of lwpstatus struct */
NT_LWPSINFO = 17, /* Contains copy of lwpinfo struct */
NT_PRFPXREG = 20, /* Contains copy of fprxregset struct */
NT_PRXFPREG = 0x46e62b7f, /* Contains copy of user_fxsr_struct */
NT_PPC_VMX = 0x100, /* PowerPC Altivec/VMX registers */
NT_PPC_SPE = 0x101, /* PowerPC SPE/EVR registers */
NT_PPC_VSX = 0x102, /* PowerPC VSX registers */
NT_386_TLS = 0x200, /* i386 TLS slots (struct user_desc) */
NT_386_IOPERM = 0x201, /* x86 io permission bitmap (1=deny) */
NT_X86_XSTATE = 0x202, /* x86 extended state using xsave */
};
/* Legal values for the note segment descriptor types for object files. */
enum {
NT_VERSION = 1, /* Contains a version string. */
};
#endif
edb-debugger/libELF/include/libELF/elf_types.h 0000644 0001750 0001750 00000003344 13765535463 020715 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_TYPES_H_20121007_
#define ELF_TYPES_H_20121007_
#include
/* Type for a 16-bit quantity. */
using elf32_half = uint16_t;
using elf64_half = uint16_t;
/* Types for signed and unsigned 32-bit quantities. */
using elf32_word = uint32_t;
using elf32_sword = int32_t;
using elf64_word = uint32_t;
using elf64_sword = int32_t;
/* Types for signed and unsigned 64-bit quantities. */
using elf32_xword = uint64_t;
using elf32_sxword = int64_t;
using elf64_xword = uint64_t;
using elf64_sxword = int64_t;
/* Type of addresses. */
using elf32_addr = uint32_t;
using elf64_addr = uint64_t;
/* Type of file offsets. */
using elf32_off = uint32_t;
using elf64_off = uint64_t;
/* Type for section indices, which are 16-bit quantities. */
using elf32_section = uint16_t;
using elf64_section = uint16_t;
/* Type for version symbol information. */
using elf32_versym = elf32_half;
using elf64_versym = elf64_half;
#endif
edb-debugger/libELF/include/libELF/elf_verdef.h 0000644 0001750 0001750 00000004615 13765535463 021026 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_VERDEF_H_20121007_
#define ELF_VERDEF_H_20121007_
#include "elf_types.h"
/* Version definition sections. */
struct elf32_verdef {
elf32_half vd_version; /* Version revision */
elf32_half vd_flags; /* Version information */
elf32_half vd_ndx; /* Version Index */
elf32_half vd_cnt; /* Number of associated aux entries */
elf32_word vd_hash; /* Version name hash value */
elf32_word vd_aux; /* Offset in bytes to verdaux array */
elf32_word vd_next; /* Offset in bytes to next verdef entry */
};
struct elf64_verdef {
elf64_half vd_version; /* Version revision */
elf64_half vd_flags; /* Version information */
elf64_half vd_ndx; /* Version Index */
elf64_half vd_cnt; /* Number of associated aux entries */
elf64_word vd_hash; /* Version name hash value */
elf64_word vd_aux; /* Offset in bytes to verdaux array */
elf64_word vd_next; /* Offset in bytes to next verdef entry */
};
/* Legal values for vd_version (version revision). */
enum {
VER_DEF_NONE = 0, /* No version */
VER_DEF_CURRENT = 1, /* Current version */
VER_DEF_NUM = 2 /* Given version number */
};
/* Legal values for vd_flags (version information flags). */
enum {
VER_FLG_BASE = 0x1, /* Version definition of file itself */
VER_FLG_WEAK = 0x2 /* Weak version identifier */
};
/* Versym symbol index values. */
enum {
VER_NDX_LOCAL = 0, /* Symbol is local. */
VER_NDX_GLOBAL = 1, /* Symbol is global. */
VER_NDX_LORESERVE = 0xff00, /* Beginning of reserved entries. */
VER_NDX_ELIMINATE = 0xff01 /* Symbol is to be eliminated. */
};
#endif
edb-debugger/libELF/include/libELF/elf_model.h 0000644 0001750 0001750 00000005707 13765535463 020656 0 ustar eteran eteran /*
Copyright (C) 2018 - 2018 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_MODEL_H_20181206_
#define ELF_MODEL_H_20181206_
#include "elf_auxv.h"
#include "elf_dyn.h"
#include "elf_header.h"
#include "elf_move.h"
#include "elf_nhdr.h"
#include "elf_phdr.h"
#include "elf_rel.h"
#include "elf_rela.h"
#include "elf_shdr.h"
#include "elf_sym.h"
#include "elf_syminfo.h"
#include "elf_types.h"
#include "elf_verdaux.h"
#include "elf_verdef.h"
#include "elf_vernaux.h"
#include "elf_verneed.h"
template
struct elf_model;
template <>
struct elf_model<64> {
// types
using elf_half = elf64_half;
using elf_word = elf64_word;
using elf_sword = elf64_sword;
using elf_xword = elf64_xword;
using elf_sxword = elf64_sxword;
using elf_addr = elf64_addr;
using elf_off = elf64_off;
using elf_section = elf64_section;
using elf_versym = elf64_versym;
// structures
using elf_auxv_t = elf64_auxv_t;
using elf_dyn = elf64_dyn;
using elf_header = elf64_header;
#if 0
using elf_lib = elf64_lib;
#endif
using elf_move = elf64_move;
using elf_nhdr = elf64_nhdr;
using elf_phdr = elf64_phdr;
using elf_rel = elf64_rel;
using elf_rela = elf64_rela;
using elf_shdr = elf64_shdr;
using elf_sym = elf64_sym;
using elf_syminfo = elf64_syminfo;
using elf_verdaux = elf64_verdaux;
using elf_verdef = elf64_verdef;
using elf_vernaux = elf64_vernaux;
using elf_verneed = elf64_verneed;
};
template <>
struct elf_model<32> {
// types
using elf_half = elf32_half;
using elf_word = elf32_word;
using elf_sword = elf32_sword;
using elf_xword = elf32_xword;
using elf_sxword = elf32_sxword;
using elf_addr = elf32_addr;
using elf_off = elf32_off;
using elf_section = elf32_section;
using elf_versym = elf32_versym;
// structures
using elf_auxv_t = elf32_auxv_t;
using elf_dyn = elf32_dyn;
using elf_header = elf32_header;
#if 0
using elf_lib = elf32_lib;
#endif
using elf_move = elf32_move;
using elf_nhdr = elf32_nhdr;
using elf_phdr = elf32_phdr;
using elf_rel = elf32_rel;
using elf_rela = elf32_rela;
using elf_shdr = elf32_shdr;
using elf_sym = elf32_sym;
using elf_syminfo = elf32_syminfo;
using elf_verdaux = elf32_verdaux;
using elf_verdef = elf32_verdef;
using elf_vernaux = elf32_vernaux;
using elf_verneed = elf32_verneed;
};
#endif
edb-debugger/libELF/include/libELF/elf_nhdr.h 0000644 0001750 0001750 00000005504 13765535463 020504 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_NHDR_H_20121007_
#define ELF_NHDR_H_20121007_
#include "elf_types.h"
/* Note section contents. Each entry in the note section begins with
a header of a fixed form. */
struct elf32_nhdr {
elf32_word n_namesz; /* Length of the note's name. */
elf32_word n_descsz; /* Length of the note's descriptor. */
elf32_word n_type; /* Type of the note. */
};
struct elf64_nhdr {
elf64_word n_namesz; /* Length of the note's name. */
elf64_word n_descsz; /* Length of the note's descriptor. */
elf64_word n_type; /* Type of the note. */
};
/* Known names of notes. */
/* Solaris entries in the note section have this name. */
#define ELF_NOTE_SOLARIS "SUNW Solaris"
/* Note entries for GNU systems have this name. */
#define ELF_NOTE_GNU "GNU"
/* Defined types of notes for Solaris. */
/* Value of descriptor (one word) is desired pagesize for the binary. */
enum {
ELF_NOTE_PAGESIZE_HINT = 1,
};
/* Defined note types for GNU systems. */
/* ABI information. The descriptor consists of words:
word 0: OS descriptor
word 1: major version of the ABI
word 2: minor version of the ABI
word 3: subminor version of the ABI
*/
enum {
NT_GNU_ABI_TAG = 1,
ELF_NOTE_ABI = NT_GNU_ABI_TAG, /* Old name. */
};
/* Known OSes. These values can appear in word 0 of an
NT_GNU_ABI_TAG note section entry. */
enum {
ELF_NOTE_OS_LINUX = 0,
ELF_NOTE_OS_GNU = 1,
ELF_NOTE_OS_SOLARIS2 = 2,
ELF_NOTE_OS_FREEBSD = 3,
};
enum {
/* Synthetic hwcap information. The descriptor begins with two words:
word 0: number of entries
word 1: bitmask of enabled entries
Then follow variable-length entries, one byte followed by a
'\0'-terminated hwcap name string. The byte gives the bit
number to test if enabled, (1U << bit) & bitmask. */
NT_GNU_HWCAP = 2,
NT_GNU_BUILD_ID = 3, /* Build ID bits as generated by ld --build-id. The descriptor consists of any nonzero number of bytes. */
NT_GNU_GOLD_VERSION = 4, /* Version note generated by GNU gold containing a version string. */
};
#endif
edb-debugger/libELF/include/libELF/elf_dyn.h 0000644 0001750 0001750 00000030703 13765535463 020342 0 ustar eteran eteran /*
Copyright (C) 2012 - 2015 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_DYN_H_20121007_
#define ELF_DYN_H_20121007_
#include "elf_types.h"
/* Dynamic section entry. */
struct elf32_dyn {
elf32_sword d_tag; /* Dynamic entry type */
union {
elf32_word d_val; /* Integer value */
elf32_addr d_ptr; /* Address value */
} d_un;
};
struct elf64_dyn {
elf64_sxword d_tag; /* Dynamic entry type */
union {
elf64_xword d_val; /* Integer value */
elf64_addr d_ptr; /* Address value */
} d_un;
};
/* Legal values for d_tag field of Elf32_Dyn. */
enum {
DT_MIPS_RLD_VERSION = 0x70000001, /* Runtime linker interface version */
DT_MIPS_TIME_STAMP = 0x70000002, /* Timestamp */
DT_MIPS_ICHECKSUM = 0x70000003, /* Checksum */
DT_MIPS_IVERSION = 0x70000004, /* Version string (string tbl index) */
DT_MIPS_FLAGS = 0x70000005, /* Flags */
DT_MIPS_BASE_ADDRESS = 0x70000006, /* Base address */
DT_MIPS_MSYM = 0x70000007,
DT_MIPS_CONFLICT = 0x70000008, /* Address of CONFLICT section */
DT_MIPS_LIBLIST = 0x70000009, /* Address of LIBLIST section */
DT_MIPS_LOCAL_GOTNO = 0x7000000a, /* Number of local GOT entries */
DT_MIPS_CONFLICTNO = 0x7000000b, /* Number of CONFLICT entries */
DT_MIPS_LIBLISTNO = 0x70000010, /* Number of LIBLIST entries */
DT_MIPS_SYMTABNO = 0x70000011, /* Number of DYNSYM entries */
DT_MIPS_UNREFEXTNO = 0x70000012, /* First external DYNSYM */
DT_MIPS_GOTSYM = 0x70000013, /* First GOT entry in DYNSYM */
DT_MIPS_HIPAGENO = 0x70000014, /* Number of GOT page table entries */
DT_MIPS_RLD_MAP = 0x70000016, /* Address of run time loader map. */
DT_MIPS_DELTA_CLASS = 0x70000017, /* Delta C++ class definition. */
DT_MIPS_DELTA_CLASS_NO = 0x70000018, /* Number of entries in DT_MIPS_DELTA_CLASS. */
DT_MIPS_DELTA_INSTANCE = 0x70000019, /* Delta C++ class instances. */
DT_MIPS_DELTA_INSTANCE_NO = 0x7000001a, /* Number of entries in DT_MIPS_DELTA_INSTANCE. */
DT_MIPS_DELTA_RELOC = 0x7000001b, /* Delta relocations. */
DT_MIPS_DELTA_RELOC_NO = 0x7000001c, /* Number of entries in DT_MIPS_DELTA_RELOC. */
DT_MIPS_DELTA_SYM = 0x7000001d, /* Delta symbols that Delta relocations refer to. */
DT_MIPS_DELTA_SYM_NO = 0x7000001e, /* Number of entries in DT_MIPS_DELTA_SYM. */
DT_MIPS_DELTA_CLASSSYM = 0x70000020, /* Delta symbols that hold the class declaration. */
DT_MIPS_DELTA_CLASSSYM_NO = 0x70000021, /* Number of entries in DT_MIPS_DELTA_CLASSSYM. */
DT_MIPS_CXX_FLAGS = 0x70000022, /* Flags indicating for C++ flavor. */
DT_MIPS_PIXIE_INIT = 0x70000023,
DT_MIPS_SYMBOL_LIB = 0x70000024,
DT_MIPS_LOCALPAGE_GOTIDX = 0x70000025,
DT_MIPS_LOCAL_GOTIDX = 0x70000026,
DT_MIPS_HIDDEN_GOTIDX = 0x70000027,
DT_MIPS_PROTECTED_GOTIDX = 0x70000028,
DT_MIPS_OPTIONS = 0x70000029, /* Address of .options. */
DT_MIPS_INTERFACE = 0x7000002a, /* Address of .interface. */
DT_MIPS_DYNSTR_ALIGN = 0x7000002b,
DT_MIPS_INTERFACE_SIZE = 0x7000002c, /* Size of the .interface section. */
DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 0x7000002d, /* Address of rld_text_rsolve function stored in GOT. */
DT_MIPS_PERF_SUFFIX = 0x7000002e, /* Default suffix of dso to be added by rld on dlopen() calls. */
DT_MIPS_COMPACT_SIZE = 0x7000002f, /* (O32)Size of compact rel section. */
DT_MIPS_GP_VALUE = 0x70000030, /* GP value for aux GOTs. */
DT_MIPS_AUX_DYNAMIC = 0x70000031, /* Address of aux .dynamic. */
/* The address of .got.plt in an executable using the new non-PIC ABI. */
DT_MIPS_PLTGOT = 0x70000032,
/* The base of the PLT in an executable using the new non-PIC ABI if that
PLT is writable. For a non-writable PLT, this is omitted or has a zero
value. */
DT_MIPS_RWPLT = 0x70000034,
DT_MIPS_NUM = 0x35,
};
/* Legal values for d_tag (dynamic entry type). */
enum {
DT_NULL = 0, /* Marks end of dynamic section */
DT_NEEDED = 1, /* Name of needed library */
DT_PLTRELSZ = 2, /* Size in bytes of PLT relocs */
DT_PLTGOT = 3, /* Processor defined value */
DT_HASH = 4, /* Address of symbol hash table */
DT_STRTAB = 5, /* Address of string table */
DT_SYMTAB = 6, /* Address of symbol table */
DT_RELA = 7, /* Address of Rela relocs */
DT_RELASZ = 8, /* Total size of Rela relocs */
DT_RELAENT = 9, /* Size of one Rela reloc */
DT_STRSZ = 10, /* Size of string table */
DT_SYMENT = 11, /* Size of one symbol table entry */
DT_INIT = 12, /* Address of init function */
DT_FINI = 13, /* Address of termination function */
DT_SONAME = 14, /* Name of shared object */
DT_RPATH = 15, /* Library search path (deprecated) */
DT_SYMBOLIC = 16, /* Start symbol search here */
DT_REL = 17, /* Address of Rel relocs */
DT_RELSZ = 18, /* Total size of Rel relocs */
DT_RELENT = 19, /* Size of one Rel reloc */
DT_PLTREL = 20, /* Type of reloc in PLT */
DT_DEBUG = 21, /* For debugging; unspecified */
DT_TEXTREL = 22, /* Reloc might modify .text */
DT_JMPREL = 23, /* Address of PLT relocs */
DT_BIND_NOW = 24, /* Process relocations of object */
DT_INIT_ARRAY = 25, /* Array with addresses of init fct */
DT_FINI_ARRAY = 26, /* Array with addresses of fini fct */
DT_INIT_ARRAYSZ = 27, /* Size in bytes of DT_INIT_ARRAY */
DT_FINI_ARRAYSZ = 28, /* Size in bytes of DT_FINI_ARRAY */
DT_RUNPATH = 29, /* Library search path */
DT_FLAGS = 30, /* Flags for the object being loaded */
DT_ENCODING = 32, /* Start of encoded range */
DT_PREINIT_ARRAY = 32, /* Array with addresses of preinit fct*/
DT_PREINIT_ARRAYSZ = 33, /* size in bytes of DT_PREINIT_ARRAY */
DT_NUM = 34, /* Number used */
DT_LOOS = 0x6000000d, /* Start of OS-specific */
DT_HIOS = 0x6ffff000, /* End of OS-specific */
DT_LOPROC = 0x70000000, /* Start of processor-specific */
DT_HIPROC = 0x7fffffff, /* End of processor-specific */
DT_PROCNUM = DT_MIPS_NUM /* Most used by any processor */
};
/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's
approach. */
enum {
DT_VALRNGLO = 0x6ffffd00,
DT_GNU_PRELINKED = 0x6ffffdf5, /* Prelinking timestamp */
DT_GNU_CONFLICTSZ = 0x6ffffdf6, /* Size of conflict section */
DT_GNU_LIBLISTSZ = 0x6ffffdf7, /* Size of library list */
DT_CHECKSUM = 0x6ffffdf8,
DT_PLTPADSZ = 0x6ffffdf9,
DT_MOVEENT = 0x6ffffdfa,
DT_MOVESZ = 0x6ffffdfb,
DT_FEATURE_1 = 0x6ffffdfc, /* Feature selection (DTF_*). */
DT_POSFLAG_1 = 0x6ffffdfd, /* Flags for DT_* entries, effecting the following DT_* entry. */
DT_SYMINSZ = 0x6ffffdfe, /* Size of syminfo table (in bytes) */
DT_SYMINENT = 0x6ffffdff, /* Entry size of syminfo */
DT_VALRNGHI = 0x6ffffdff,
DT_VALNUM = 12,
};
constexpr inline uint32_t DT_VALTAGIDX(uint32_t tag) {
return DT_VALRNGHI - tag; /* Reverse order! */
}
/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
If any adjustment is made to the ELF object after it has been
built these entries will need to be adjusted. */
enum {
DT_ADDRRNGLO = 0x6ffffe00,
DT_GNU_HASH = 0x6ffffef5, /* GNU-style hash table. */
DT_TLSDESC_PLT = 0x6ffffef6,
DT_TLSDESC_GOT = 0x6ffffef7,
DT_GNU_CONFLICT = 0x6ffffef8, /* Start of conflict section */
DT_GNU_LIBLIST = 0x6ffffef9, /* Library list */
DT_CONFIG = 0x6ffffefa, /* Configuration information. */
DT_DEPAUDIT = 0x6ffffefb, /* Dependency auditing. */
DT_AUDIT = 0x6ffffefc, /* Object auditing. */
DT_PLTPAD = 0x6ffffefd, /* PLT padding. */
DT_MOVETAB = 0x6ffffefe, /* Move table. */
DT_SYMINFO = 0x6ffffeff, /* Syminfo table. */
DT_ADDRRNGHI = 0x6ffffeff,
DT_ADDRNUM = 11,
};
constexpr inline uint32_t DT_ADDRTAGIDX(uint32_t tag) {
return DT_ADDRRNGHI - tag; /* Reverse order! */
}
/* The versioning entry types. The next are defined as part of the
GNU extension. */
enum {
DT_VERSYM = 0x6ffffff0,
};
enum {
DT_RELACOUNT = 0x6ffffff9,
DT_RELCOUNT = 0x6ffffffa,
};
/* These were chosen by Sun. */
enum {
DT_FLAGS_1 = 0x6ffffffb, /* State flags, see DF_1_* below. */
DT_VERDEF = 0x6ffffffc, /* Address of version definition table */
DT_VERDEFNUM = 0x6ffffffd, /* Number of version definitions */
DT_VERNEED = 0x6ffffffe, /* Address of table with needed versions */
DT_VERNEEDNUM = 0x6fffffff, /* Number of needed versions */
DT_VERSIONTAGNUM = 16,
};
constexpr inline uint32_t DT_VERSIONTAGIDX(uint32_t tag) {
return DT_VERNEEDNUM - tag; /* Reverse order! */
}
/* Sun added these machine-independent extensions in the "processor-specific"
range. Be compatible. */
enum {
DT_AUXILIARY = 0x7ffffffd, /* Shared object to load before self */
DT_FILTER = 0x7fffffff, /* Shared object to get values from */
DT_EXTRANUM = 3,
};
constexpr inline uint32_t DT_EXTRATAGIDX(uint32_t tag) {
return static_cast(-(static_cast(tag) << 1 >> 1) - 1);
}
/* Values of `d_un.d_val' in the DT_FLAGS entry. */
enum {
DF_ORIGIN = 0x00000001, /* Object may use DF_ORIGIN */
DF_SYMBOLIC = 0x00000002, /* Symbol resolutions starts here */
DF_TEXTREL = 0x00000004, /* Object contains text relocations */
DF_BIND_NOW = 0x00000008, /* No lazy binding for this object */
DF_STATIC_TLS = 0x00000010, /* Module uses the static TLS model */
};
/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
entry in the dynamic section. */
enum {
DF_1_NOW = 0x00000001, /* Set RTLD_NOW for this object. */
DF_1_GLOBAL = 0x00000002, /* Set RTLD_GLOBAL for this object. */
DF_1_GROUP = 0x00000004, /* Set RTLD_GROUP for this object. */
DF_1_NODELETE = 0x00000008, /* Set RTLD_NODELETE for this object.*/
DF_1_LOADFLTR = 0x00000010, /* Trigger filtee loading at runtime.*/
DF_1_INITFIRST = 0x00000020, /* Set RTLD_INITFIRST for this object*/
DF_1_NOOPEN = 0x00000040, /* Set RTLD_NOOPEN for this object. */
DF_1_ORIGIN = 0x00000080, /* $ORIGIN must be handled. */
DF_1_DIRECT = 0x00000100, /* Direct binding enabled. */
DF_1_TRANS = 0x00000200,
DF_1_INTERPOSE = 0x00000400, /* Object is used to interpose. */
DF_1_NODEFLIB = 0x00000800, /* Ignore default lib search path. */
DF_1_NODUMP = 0x00001000, /* Object can't be dldump'ed. */
DF_1_CONFALT = 0x00002000, /* Configuration alternative created.*/
DF_1_ENDFILTEE = 0x00004000, /* Filtee terminates filters search. */
DF_1_DISPRELDNE = 0x00008000, /* Disp reloc applied at build time. */
DF_1_DISPRELPND = 0x00010000, /* Disp reloc applied at run-time. */
};
/* Flags for the feature selection in DT_FEATURE_1. */
enum {
DTF_1_PARINIT = 0x00000001,
DTF_1_CONFEXP = 0x00000002,
};
/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */
enum {
DF_P1_LAZYLOAD = 0x00000001, /* Lazyload following object. */
DF_P1_GROUPPERM = 0x00000002, /* Symbols from next object are not generally available. */
};
#endif
edb-debugger/libELF/include/libELF/elf_binary.h 0000644 0001750 0001750 00000216107 13765535463 021040 0 ustar eteran eteran /*
Copyright (C) 2012 Evan Teran
evan.teran@gmail.com
Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef ELF_BINARY_H_20121007_
#define ELF_BINARY_H_20121007_
#include "elf_auxv.h"
#include "elf_dyn.h"
#include "elf_header.h"
#include "elf_move.h"
#include "elf_nhdr.h"
#include "elf_phdr.h"
#include "elf_rel.h"
#include "elf_rela.h"
#include "elf_shdr.h"
#include "elf_sym.h"
#include "elf_syminfo.h"
#include "elf_types.h"
#include "elf_verdaux.h"
#include "elf_verdef.h"
#include "elf_vernaux.h"
#include "elf_verneed.h"
/* Motorola 68k specific definitions. */
/* Values for Elf32_Ehdr.e_flags. */
enum { EF_CPU32 = 0x00810000 };
/* m68k relocs. */
enum {
R_68K_NONE = 0, /* No reloc */
R_68K_32 = 1, /* Direct 32 bit */
R_68K_16 = 2, /* Direct 16 bit */
R_68K_8 = 3, /* Direct 8 bit */
R_68K_PC32 = 4, /* PC relative 32 bit */
R_68K_PC16 = 5, /* PC relative 16 bit */
R_68K_PC8 = 6, /* PC relative 8 bit */
R_68K_GOT32 = 7, /* 32 bit PC relative GOT entry */
R_68K_GOT16 = 8, /* 16 bit PC relative GOT entry */
R_68K_GOT8 = 9, /* 8 bit PC relative GOT entry */
R_68K_GOT32O = 10, /* 32 bit GOT offset */
R_68K_GOT16O = 11, /* 16 bit GOT offset */
R_68K_GOT8O = 12, /* 8 bit GOT offset */
R_68K_PLT32 = 13, /* 32 bit PC relative PLT address */
R_68K_PLT16 = 14, /* 16 bit PC relative PLT address */
R_68K_PLT8 = 15, /* 8 bit PC relative PLT address */
R_68K_PLT32O = 16, /* 32 bit PLT offset */
R_68K_PLT16O = 17, /* 16 bit PLT offset */
R_68K_PLT8O = 18, /* 8 bit PLT offset */
R_68K_COPY = 19, /* Copy symbol at runtime */
R_68K_GLOB_DAT = 20, /* Create GOT entry */
R_68K_JMP_SLOT = 21, /* Create PLT entry */
R_68K_RELATIVE = 22, /* Adjust by program base */
R_68K_TLS_GD32 = 25, /* 32 bit GOT offset for GD */
R_68K_TLS_GD16 = 26, /* 16 bit GOT offset for GD */
R_68K_TLS_GD8 = 27, /* 8 bit GOT offset for GD */
R_68K_TLS_LDM32 = 28, /* 32 bit GOT offset for LDM */
R_68K_TLS_LDM16 = 29, /* 16 bit GOT offset for LDM */
R_68K_TLS_LDM8 = 30, /* 8 bit GOT offset for LDM */
R_68K_TLS_LDO32 = 31, /* 32 bit module-relative offset */
R_68K_TLS_LDO16 = 32, /* 16 bit module-relative offset */
R_68K_TLS_LDO8 = 33, /* 8 bit module-relative offset */
R_68K_TLS_IE32 = 34, /* 32 bit GOT offset for IE */
R_68K_TLS_IE16 = 35, /* 16 bit GOT offset for IE */
R_68K_TLS_IE8 = 36, /* 8 bit GOT offset for IE */
R_68K_TLS_LE32 = 37, /* 32 bit offset relative to static TLS block */
R_68K_TLS_LE16 = 38, /* 16 bit offset relative to static TLS block */
R_68K_TLS_LE8 = 39, /* 8 bit offset relative to static TLS block */
R_68K_TLS_DTPMOD32 = 40, /* 32 bit module number */
R_68K_TLS_DTPREL32 = 41, /* 32 bit module-relative offset */
R_68K_TLS_TPREL32 = 42, /* 32 bit TP-relative offset */
/* Keep this the last entry. */
R_68K_NUM = 43
};
/* Intel 80386 specific definitions. */
/* i386 relocs. */
enum {
R_386_NONE = 0, /* No reloc */
R_386_32 = 1, /* Direct 32 bit */
R_386_PC32 = 2, /* PC relative 32 bit */
R_386_GOT32 = 3, /* 32 bit GOT entry */
R_386_PLT32 = 4, /* 32 bit PLT address */
R_386_COPY = 5, /* Copy symbol at runtime */
R_386_GLOB_DAT = 6, /* Create GOT entry */
R_386_JMP_SLOT = 7, /* Create PLT entry */
R_386_RELATIVE = 8, /* Adjust by program base */
R_386_GOTOFF = 9, /* 32 bit offset to GOT */
R_386_GOTPC = 10, /* 32 bit PC relative offset to GOT */
R_386_32PLT = 11,
R_386_TLS_TPOFF = 14, /* Offset in static TLS block */
R_386_TLS_IE = 15, /* Address of GOT entry for static TLS block offset */
R_386_TLS_GOTIE = 16, /* GOT entry for static TLS block offset */
R_386_TLS_LE = 17, /* Offset relative to static TLS block */
R_386_TLS_GD = 18, /* Direct 32 bit for GNU version of general dynamic thread local data */
R_386_TLS_LDM = 19, /* Direct 32 bit for GNU version of local dynamic thread local data in LE code */
R_386_16 = 20,
R_386_PC16 = 21,
R_386_8 = 22,
R_386_PC8 = 23,
R_386_TLS_GD_32 = 24, /* Direct 32 bit for general dynamic thread local data */
R_386_TLS_GD_PUSH = 25, /* Tag for pushl in GD TLS code */
R_386_TLS_GD_CALL = 26, /* Relocation for call to __tls_get_addr() */
R_386_TLS_GD_POP = 27, /* Tag for popl in GD TLS code */
R_386_TLS_LDM_32 = 28, /* Direct 32 bit for local dynamic thread local data in LE code */
R_386_TLS_LDM_PUSH = 29, /* Tag for pushl in LDM TLS code */
R_386_TLS_LDM_CALL = 30, /* Relocation for call to __tls_get_addr() in LDM code */
R_386_TLS_LDM_POP = 31, /* Tag for popl in LDM TLS code */
R_386_TLS_LDO_32 = 32, /* Offset relative to TLS block */
R_386_TLS_IE_32 = 33, /* GOT entry for negated static TLS block offset */
R_386_TLS_LE_32 = 34, /* Negated offset relative to static TLS block */
R_386_TLS_DTPMOD32 = 35, /* ID of module containing symbol */
R_386_TLS_DTPOFF32 = 36, /* Offset in TLS block */
R_386_TLS_TPOFF32 = 37, /* Negated offset in static TLS block */
/* 38? */
R_386_TLS_GOTDESC = 39, /* GOT offset for TLS descriptor. */
R_386_TLS_DESC_CALL = 40, /* Marker of call through TLS descriptor for relaxation. */
R_386_TLS_DESC = 41, /* TLS descriptor containing pointer to code and to argument, returning the TLS offset for the symbol. */
R_386_IRELATIVE = 42, /* Adjust indirectly by program base */
/* Keep this the last entry. */
R_386_NUM = 43
};
/* SUN SPARC specific definitions. */
/* Legal values for ST_TYPE subfield of st_info (symbol type). */
enum {
STT_SPARC_REGISTER = 13 /* Global register reserved to app. */
};
/* Values for Elf64_Ehdr.e_flags. */
enum {
EF_SPARCV9_MM = 3,
EF_SPARCV9_TSO = 0,
EF_SPARCV9_PSO = 1,
EF_SPARCV9_RMO = 2,
EF_SPARC_LEDATA = 0x800000, /* little endian data */
EF_SPARC_EXT_MASK = 0xFFFF00,
EF_SPARC_32PLUS = 0x000100, /* generic V8+ features */
EF_SPARC_SUN_US1 = 0x000200, /* Sun UltraSPARC1 extensions */
EF_SPARC_HAL_R1 = 0x000400, /* HAL R1 extensions */
EF_SPARC_SUN_US3 = 0x000800 /* Sun UltraSPARCIII extensions */
};
/* SPARC relocs. */
enum {
R_SPARC_NONE = 0, /* No reloc */
R_SPARC_8 = 1, /* Direct 8 bit */
R_SPARC_16 = 2, /* Direct 16 bit */
R_SPARC_32 = 3, /* Direct 32 bit */
R_SPARC_DISP8 = 4, /* PC relative 8 bit */
R_SPARC_DISP16 = 5, /* PC relative 16 bit */
R_SPARC_DISP32 = 6, /* PC relative 32 bit */
R_SPARC_WDISP30 = 7, /* PC relative 30 bit shifted */
R_SPARC_WDISP22 = 8, /* PC relative 22 bit shifted */
R_SPARC_HI22 = 9, /* High 22 bit */
R_SPARC_22 = 10, /* Direct 22 bit */
R_SPARC_13 = 11, /* Direct 13 bit */
R_SPARC_LO10 = 12, /* Truncated 10 bit */
R_SPARC_GOT10 = 13, /* Truncated 10 bit GOT entry */
R_SPARC_GOT13 = 14, /* 13 bit GOT entry */
R_SPARC_GOT22 = 15, /* 22 bit GOT entry shifted */
R_SPARC_PC10 = 16, /* PC relative 10 bit truncated */
R_SPARC_PC22 = 17, /* PC relative 22 bit shifted */
R_SPARC_WPLT30 = 18, /* 30 bit PC relative PLT address */
R_SPARC_COPY = 19, /* Copy symbol at runtime */
R_SPARC_GLOB_DAT = 20, /* Create GOT entry */
R_SPARC_JMP_SLOT = 21, /* Create PLT entry */
R_SPARC_RELATIVE = 22, /* Adjust by program base */
R_SPARC_UA32 = 23, /* Direct 32 bit unaligned */
};
/* Additional Sparc64 relocs. */
enum {
R_SPARC_PLT32 = 24, /* Direct 32 bit ref to PLT entry */
R_SPARC_HIPLT22 = 25, /* High 22 bit PLT entry */
R_SPARC_LOPLT10 = 26, /* Truncated 10 bit PLT entry */
R_SPARC_PCPLT32 = 27, /* PC rel 32 bit ref to PLT entry */
R_SPARC_PCPLT22 = 28, /* PC rel high 22 bit PLT entry */
R_SPARC_PCPLT10 = 29, /* PC rel trunc 10 bit PLT entry */
R_SPARC_10 = 30, /* Direct 10 bit */
R_SPARC_11 = 31, /* Direct 11 bit */
R_SPARC_64 = 32, /* Direct 64 bit */
R_SPARC_OLO10 = 33, /* 10bit with secondary 13bit addend */
R_SPARC_HH22 = 34, /* Top 22 bits of direct 64 bit */
R_SPARC_HM10 = 35, /* High middle 10 bits of ... */
R_SPARC_LM22 = 36, /* Low middle 22 bits of ... */
R_SPARC_PC_HH22 = 37, /* Top 22 bits of pc rel 64 bit */
R_SPARC_PC_HM10 = 38, /* High middle 10 bit of ... */
R_SPARC_PC_LM22 = 39, /* Low miggle 22 bits of ... */
R_SPARC_WDISP16 = 40, /* PC relative 16 bit shifted */
R_SPARC_WDISP19 = 41, /* PC relative 19 bit shifted */
R_SPARC_GLOB_JMP = 42, /* was part of v9 ABI but was removed */
R_SPARC_7 = 43, /* Direct 7 bit */
R_SPARC_5 = 44, /* Direct 5 bit */
R_SPARC_6 = 45, /* Direct 6 bit */
R_SPARC_DISP64 = 46, /* PC relative 64 bit */
R_SPARC_PLT64 = 47, /* Direct 64 bit ref to PLT entry */
R_SPARC_HIX22 = 48, /* High 22 bit complemented */
R_SPARC_LOX10 = 49, /* Truncated 11 bit complemented */
R_SPARC_H44 = 50, /* Direct high 12 of 44 bit */
R_SPARC_M44 = 51, /* Direct mid 22 of 44 bit */
R_SPARC_L44 = 52, /* Direct low 10 of 44 bit */
R_SPARC_REGISTER = 53, /* Global register usage */
R_SPARC_UA64 = 54, /* Direct 64 bit unaligned */
R_SPARC_UA16 = 55, /* Direct 16 bit unaligned */
R_SPARC_TLS_GD_HI22 = 56,
R_SPARC_TLS_GD_LO10 = 57,
R_SPARC_TLS_GD_ADD = 58,
R_SPARC_TLS_GD_CALL = 59,
R_SPARC_TLS_LDM_HI22 = 60,
R_SPARC_TLS_LDM_LO10 = 61,
R_SPARC_TLS_LDM_ADD = 62,
R_SPARC_TLS_LDM_CALL = 63,
R_SPARC_TLS_LDO_HIX22 = 64,
R_SPARC_TLS_LDO_LOX10 = 65,
R_SPARC_TLS_LDO_ADD = 66,
R_SPARC_TLS_IE_HI22 = 67,
R_SPARC_TLS_IE_LO10 = 68,
R_SPARC_TLS_IE_LD = 69,
R_SPARC_TLS_IE_LDX = 70,
R_SPARC_TLS_IE_ADD = 71,
R_SPARC_TLS_LE_HIX22 = 72,
R_SPARC_TLS_LE_LOX10 = 73,
R_SPARC_TLS_DTPMOD32 = 74,
R_SPARC_TLS_DTPMOD64 = 75,
R_SPARC_TLS_DTPOFF32 = 76,
R_SPARC_TLS_DTPOFF64 = 77,
R_SPARC_TLS_TPOFF32 = 78,
R_SPARC_TLS_TPOFF64 = 79,
R_SPARC_GOTDATA_HIX22 = 80,
R_SPARC_GOTDATA_LOX10 = 81,
R_SPARC_GOTDATA_OP_HIX22 = 82,
R_SPARC_GOTDATA_OP_LOX10 = 83,
R_SPARC_GOTDATA_OP = 84,
R_SPARC_H34 = 85,
R_SPARC_SIZE32 = 86,
R_SPARC_SIZE64 = 87,
R_SPARC_JMP_IREL = 248,
R_SPARC_IRELATIVE = 249,
R_SPARC_GNU_VTINHERIT = 250,
R_SPARC_GNU_VTENTRY = 251,
R_SPARC_REV32 = 252,
/* Keep this the last entry. */
R_SPARC_NUM = 253,
};
/* For Sparc64, legal values for d_tag of Elf64_Dyn. */
enum {
DT_SPARC_REGISTER = 0x70000001,
DT_SPARC_NUM = 2,
};
/* MIPS R3000 specific definitions. */
/* Legal values for e_flags field of Elf32_Ehdr. */
enum {
EF_MIPS_NOREORDER = 1, /* A .noreorder directive was used */
EF_MIPS_PIC = 2, /* Contains PIC code */
EF_MIPS_CPIC = 4, /* Uses PIC calling sequence */
EF_MIPS_XGOT = 8,
EF_MIPS_64BIT_WHIRL = 16,
EF_MIPS_ABI2 = 32,
EF_MIPS_ABI_ON32 = 64,
EF_MIPS_ARCH = 0xf0000000 /* MIPS architecture level */
};
/* Legal values for MIPS architecture level. */
enum {
EF_MIPS_ARCH_1 = 0x00000000, /* -mips1 code. */
EF_MIPS_ARCH_2 = 0x10000000, /* -mips2 code. */
EF_MIPS_ARCH_3 = 0x20000000, /* -mips3 code. */
EF_MIPS_ARCH_4 = 0x30000000, /* -mips4 code. */
EF_MIPS_ARCH_5 = 0x40000000, /* -mips5 code. */
EF_MIPS_ARCH_32 = 0x60000000, /* MIPS32 code. */
EF_MIPS_ARCH_64 = 0x70000000, /* MIPS64 code. */
};
/* The following are non-official names and should not be used. */
enum {
E_MIPS_ARCH_1 = 0x00000000, /* -mips1 code. */
E_MIPS_ARCH_2 = 0x10000000, /* -mips2 code. */
E_MIPS_ARCH_3 = 0x20000000, /* -mips3 code. */
E_MIPS_ARCH_4 = 0x30000000, /* -mips4 code. */
E_MIPS_ARCH_5 = 0x40000000, /* -mips5 code. */
E_MIPS_ARCH_32 = 0x60000000, /* MIPS32 code. */
E_MIPS_ARCH_64 = 0x70000000, /* MIPS64 code. */
};
/* Special section indices. */
enum {
SHN_MIPS_ACOMMON = 0xff00, /* Allocated common symbols */
SHN_MIPS_TEXT = 0xff01, /* Allocated test symbols. */
SHN_MIPS_DATA = 0xff02, /* Allocated data symbols. */
SHN_MIPS_SCOMMON = 0xff03, /* Small common symbols */
SHN_MIPS_SUNDEFINED = 0xff04, /* Small undefined symbols */
};
/* Legal values for sh_type field of Elf32_Shdr. */
enum {
SHT_MIPS_LIBLIST = 0x70000000, /* Shared objects used in link */
SHT_MIPS_MSYM = 0x70000001,
SHT_MIPS_CONFLICT = 0x70000002, /* Conflicting symbols */
SHT_MIPS_GPTAB = 0x70000003, /* Global data area sizes */
SHT_MIPS_UCODE = 0x70000004, /* Reserved for SGI/MIPS compilers */
SHT_MIPS_DEBUG = 0x70000005, /* MIPS ECOFF debugging information*/
SHT_MIPS_REGINFO = 0x70000006, /* Register usage information */
SHT_MIPS_PACKAGE = 0x70000007,
SHT_MIPS_PACKSYM = 0x70000008,
SHT_MIPS_RELD = 0x70000009,
SHT_MIPS_IFACE = 0x7000000b,
SHT_MIPS_CONTENT = 0x7000000c,
SHT_MIPS_OPTIONS = 0x7000000d, /* Miscellaneous options. */
SHT_MIPS_SHDR = 0x70000010,
SHT_MIPS_FDESC = 0x70000011,
SHT_MIPS_EXTSYM = 0x70000012,
SHT_MIPS_DENSE = 0x70000013,
SHT_MIPS_PDESC = 0x70000014,
SHT_MIPS_LOCSYM = 0x70000015,
SHT_MIPS_AUXSYM = 0x70000016,
SHT_MIPS_OPTSYM = 0x70000017,
SHT_MIPS_LOCSTR = 0x70000018,
SHT_MIPS_LINE = 0x70000019,
SHT_MIPS_RFDESC = 0x7000001a,
SHT_MIPS_DELTASYM = 0x7000001b,
SHT_MIPS_DELTAINST = 0x7000001c,
SHT_MIPS_DELTACLASS = 0x7000001d,
SHT_MIPS_DWARF = 0x7000001e, /* DWARF debugging information. */
SHT_MIPS_DELTADECL = 0x7000001f,
SHT_MIPS_SYMBOL_LIB = 0x70000020,
SHT_MIPS_EVENTS = 0x70000021, /* Event section. */
SHT_MIPS_TRANSLATE = 0x70000022,
SHT_MIPS_PIXIE = 0x70000023,
SHT_MIPS_XLATE = 0x70000024,
SHT_MIPS_XLATE_DEBUG = 0x70000025,
SHT_MIPS_WHIRL = 0x70000026,
SHT_MIPS_EH_REGION = 0x70000027,
SHT_MIPS_XLATE_OLD = 0x70000028,
SHT_MIPS_PDR_EXCEPTION = 0x70000029,
};
/* Legal values for sh_flags field of Elf32_Shdr. */
enum {
SHF_MIPS_GPREL = 0x10000000, /* Must be part of global data area */
SHF_MIPS_MERGE = 0x20000000,
SHF_MIPS_ADDR = 0x40000000,
SHF_MIPS_STRINGS = 0x80000000,
SHF_MIPS_NOSTRIP = 0x08000000,
SHF_MIPS_LOCAL = 0x04000000,
SHF_MIPS_NAMES = 0x02000000,
SHF_MIPS_NODUPE = 0x01000000,
};
/* Symbol tables. */
/* MIPS specific values for `st_other'. */
enum {
STO_MIPS_DEFAULT = 0x0,
STO_MIPS_INTERNAL = 0x1,
STO_MIPS_HIDDEN = 0x2,
STO_MIPS_PROTECTED = 0x3,
STO_MIPS_PLT = 0x8,
STO_MIPS_SC_ALIGN_UNUSED = 0xff,
};
/* MIPS specific values for `st_info'. */
enum {
STB_MIPS_SPLIT_COMMON = 13,
};
/* Entries found in sections of type SHT_MIPS_GPTAB. */
union elf32_gptab {
struct {
elf32_word gt_current_g_value; /* -G value used for compilation */
elf32_word gt_unused; /* Not used */
} gt_header; /* First entry in section */
struct {
elf32_word gt_g_value; /* If this value were used for -G */
elf32_word gt_bytes; /* This many bytes would be used */
} gt_entry; /* Subsequent entries in section */
};
/* Entry found in sections of type SHT_MIPS_REGINFO. */
struct elf32_reginfo {
elf32_word ri_gprmask; /* General registers used */
elf32_word ri_cprmask[4]; /* Coprocessor registers used */
elf32_sword ri_gp_value; /* $gp register value */
};
/* Entries found in sections of type SHT_MIPS_OPTIONS. */
struct elf_options {
uint8_t kind; /* Determines interpretation of the variable part of descriptor. */
uint8_t size; /* Size of descriptor, including header. */
elf32_section section; /* Section header index of section affected, 0 for global options. */
elf32_word info; /* Kind-specific information. */
};
/* Values for `kind' field in Elf_Options. */
enum {
ODK_NULL = 0, /* Undefined. */
ODK_REGINFO = 1, /* Register usage information. */
ODK_EXCEPTIONS = 2, /* Exception processing options. */
ODK_PAD = 3, /* Section padding options. */
ODK_HWPATCH = 4, /* Hardware workarounds performed */
ODK_FILL = 5, /* record the fill value used by the linker. */
ODK_TAGS = 6, /* reserve space for desktop tools to write. */
ODK_HWAND = 7, /* HW workarounds. 'AND' bits when merging. */
ODK_HWOR = 8, /* HW workarounds. 'OR' bits when merging. */
};
/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */
enum {
OEX_FPU_MIN = 0x1f, /* FPE's which MUST be enabled. */
OEX_FPU_MAX = 0x1f00, /* FPE's which MAY be enabled. */
OEX_PAGE0 = 0x10000, /* page zero must be mapped. */
OEX_SMM = 0x20000, /* Force sequential memory mode? */
OEX_FPDBUG = 0x40000, /* Force floating point debug mode? */
OEX_PRECISEFP = OEX_FPDBUG,
OEX_DISMISS = 0x80000, /* Dismiss invalid address faults? */
OEX_FPU_INVAL = 0x10,
OEX_FPU_DIV0 = 0x08,
OEX_FPU_OFLO = 0x04,
OEX_FPU_UFLO = 0x02,
OEX_FPU_INEX = 0x01,
};
/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */
enum {
OHW_R4KEOP = 0x1, /* R4000 end-of-page patch. */
OHW_R8KPFETCH = 0x2, /* may need R8000 prefetch patch. */
OHW_R5KEOP = 0x4, /* R5000 end-of-page patch. */
OHW_R5KCVTL = 0x8, /* R5000 cvt.[ds].l bug. clean=1. */
OPAD_PREFIX = 0x1,
OPAD_POSTFIX = 0x2,
OPAD_SYMBOL = 0x4,
};
/* Entry found in `.options' section. */
struct elf_options_hw {
elf32_word hwp_flags1; /* Extra flags. */
elf32_word hwp_flags2; /* Extra flags. */
};
/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */
enum {
OHWA0_R4KEOP_CHECKED = 0x00000001,
OHWA1_R4KEOP_CLEAN = 0x00000002,
};
/* MIPS relocs. */
enum {
R_MIPS_NONE = 0, /* No reloc */
R_MIPS_16 = 1, /* Direct 16 bit */
R_MIPS_32 = 2, /* Direct 32 bit */
R_MIPS_REL32 = 3, /* PC relative 32 bit */
R_MIPS_26 = 4, /* Direct 26 bit shifted */
R_MIPS_HI16 = 5, /* High 16 bit */
R_MIPS_LO16 = 6, /* Low 16 bit */
R_MIPS_GPREL16 = 7, /* GP relative 16 bit */
R_MIPS_LITERAL = 8, /* 16 bit literal entry */
R_MIPS_GOT16 = 9, /* 16 bit GOT entry */
R_MIPS_PC16 = 10, /* PC relative 16 bit */
R_MIPS_CALL16 = 11, /* 16 bit GOT entry for function */
R_MIPS_GPREL32 = 12, /* GP relative 32 bit */
R_MIPS_SHIFT5 = 16,
R_MIPS_SHIFT6 = 17,
R_MIPS_64 = 18,
R_MIPS_GOT_DISP = 19,
R_MIPS_GOT_PAGE = 20,
R_MIPS_GOT_OFST = 21,
R_MIPS_GOT_HI16 = 22,
R_MIPS_GOT_LO16 = 23,
R_MIPS_SUB = 24,
R_MIPS_INSERT_A = 25,
R_MIPS_INSERT_B = 26,
R_MIPS_DELETE = 27,
R_MIPS_HIGHER = 28,
R_MIPS_HIGHEST = 29,
R_MIPS_CALL_HI16 = 30,
R_MIPS_CALL_LO16 = 31,
R_MIPS_SCN_DISP = 32,
R_MIPS_REL16 = 33,
R_MIPS_ADD_IMMEDIATE = 34,
R_MIPS_PJUMP = 35,
R_MIPS_RELGOT = 36,
R_MIPS_JALR = 37,
R_MIPS_TLS_DTPMOD32 = 38, /* Module number 32 bit */
R_MIPS_TLS_DTPREL32 = 39, /* Module-relative offset 32 bit */
R_MIPS_TLS_DTPMOD64 = 40, /* Module number 64 bit */
R_MIPS_TLS_DTPREL64 = 41, /* Module-relative offset 64 bit */
R_MIPS_TLS_GD = 42, /* 16 bit GOT offset for GD */
R_MIPS_TLS_LDM = 43, /* 16 bit GOT offset for LDM */
R_MIPS_TLS_DTPREL_HI16 = 44, /* Module-relative offset, high 16 bits */
R_MIPS_TLS_DTPREL_LO16 = 45, /* Module-relative offset, low 16 bits */
R_MIPS_TLS_GOTTPREL = 46, /* 16 bit GOT offset for IE */
R_MIPS_TLS_TPREL32 = 47, /* TP-relative offset, 32 bit */
R_MIPS_TLS_TPREL64 = 48, /* TP-relative offset, 64 bit */
R_MIPS_TLS_TPREL_HI16 = 49, /* TP-relative offset, high 16 bits */
R_MIPS_TLS_TPREL_LO16 = 50, /* TP-relative offset, low 16 bits */
R_MIPS_GLOB_DAT = 51,
R_MIPS_COPY = 126,
R_MIPS_JUMP_SLOT = 127,
/* Keep this the last entry. */
R_MIPS_NUM = 128,
};
/* Legal values for p_type field of Elf32_Phdr. */
enum {
PT_MIPS_REGINFO = 0x70000000, /* Register usage information */
PT_MIPS_RTPROC = 0x70000001, /* Runtime procedure table. */
PT_MIPS_OPTIONS = 0x70000002,
};
/* Special program header types. */
enum {
PF_MIPS_LOCAL = 0x10000000,
};
/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */
enum {
RHF_NONE = 0, /* No flags */
RHF_QUICKSTART = (1 << 0), /* Use quickstart */
RHF_NOTPOT = (1 << 1), /* Hash size not power of 2 */
RHF_NO_LIBRARY_REPLACEMENT = (1 << 2), /* Ignore LD_LIBRARY_PATH */
RHF_NO_MOVE = (1 << 3),
RHF_SGI_ONLY = (1 << 4),
RHF_GUARANTEE_INIT = (1 << 5),
RHF_DELTA_C_PLUS_PLUS = (1 << 6),
RHF_GUARANTEE_START_INIT = (1 << 7),
RHF_PIXIE = (1 << 8),
RHF_DEFAULT_DELAY_LOAD = (1 << 9),
RHF_REQUICKSTART = (1 << 10),
RHF_REQUICKSTARTED = (1 << 11),
RHF_CORD = (1 << 12),
RHF_NO_UNRES_UNDEF = (1 << 13),
RHF_RLD_ORDER_SAFE = (1 << 14),
};
/* Entries found in sections of type SHT_MIPS_LIBLIST. */
struct elf32_lib {
elf32_word l_name; /* Name (string table index) */
elf32_word l_time_stamp; /* Timestamp */
elf32_word l_checksum; /* Checksum */
elf32_word l_version; /* Interface version */
elf32_word l_flags; /* Flags */
};
struct elf64_lib {
elf64_word l_name; /* Name (string table index) */
elf64_word l_time_stamp; /* Timestamp */
elf64_word l_checksum; /* Checksum */
elf64_word l_version; /* Interface version */
elf64_word l_flags; /* Flags */
};
/* Legal values for l_flags. */
enum {
LL_NONE = 0,
LL_EXACT_MATCH = (1 << 0), /* Require exact match */
LL_IGNORE_INT_VER = (1 << 1), /* Ignore interface version */
LL_REQUIRE_MINOR = (1 << 2),
LL_EXPORTS = (1 << 3),
LL_DELAY_LOAD = (1 << 4),
LL_DELTA = (1 << 5),
};
/* Entries found in sections of type SHT_MIPS_CONFLICT. */
using elf32_conflict = elf32_addr;
/* HPPA specific definitions. */
/* Legal values for e_flags field of Elf32_Ehdr. */
enum {
EF_PARISC_TRAPNIL = 0x00010000, /* Trap nil pointer dereference. */
EF_PARISC_EXT = 0x00020000, /* Program uses arch. extensions. */
EF_PARISC_LSB = 0x00040000, /* Program expects little endian. */
EF_PARISC_WIDE = 0x00080000, /* Program expects wide mode. */
EF_PARISC_NO_KABP = 0x00100000, /* No kernel assisted branch prediction. */
EF_PARISC_LAZYSWAP = 0x00400000, /* Allow lazy swapping. */
EF_PARISC_ARCH = 0x0000ffff, /* Architecture version. */
};
/* Defined values for `e_flags & EF_PARISC_ARCH' are: */
enum {
EFA_PARISC_1_0 = 0x020b, /* PA-RISC 1.0 big-endian. */
EFA_PARISC_1_1 = 0x0210, /* PA-RISC 1.1 big-endian. */
EFA_PARISC_2_0 = 0x0214, /* PA-RISC 2.0 big-endian. */
};
/* Additional section indeces. */
enum {
SHN_PARISC_ANSI_COMMON = 0xff00, /* Section for tenatively declared symbols in ANSI C. */
SHN_PARISC_HUGE_COMMON = 0xff01, /* Common blocks in huge model. */
};
/* Legal values for sh_type field of Elf32_Shdr. */
enum {
SHT_PARISC_EXT = 0x70000000, /* Contains product specific ext. */
SHT_PARISC_UNWIND = 0x70000001, /* Unwind information. */
SHT_PARISC_DOC = 0x70000002, /* Debug info for optimized code. */
};
/* Legal values for sh_flags field of Elf32_Shdr. */
enum {
SHF_PARISC_SHORT = 0x20000000, /* Section with short addressing. */
SHF_PARISC_HUGE = 0x40000000, /* Section far from gp. */
SHF_PARISC_SBP = 0x80000000, /* Static branch prediction code. */
};
/* Legal values for ST_TYPE subfield of st_info (symbol type). */
enum {
STT_PARISC_MILLICODE = 13 /* Millicode function entry point. */
};
enum {
STT_HP_OPAQUE = (STT_LOOS + 0x1),
STT_HP_STUB = (STT_LOOS + 0x2),
};
/* HPPA relocs. */
enum {
R_PARISC_NONE = 0, /* No reloc. */
R_PARISC_DIR32 = 1, /* Direct 32-bit reference. */
R_PARISC_DIR21L = 2, /* Left 21 bits of eff. address. */
R_PARISC_DIR17R = 3, /* Right 17 bits of eff. address. */
R_PARISC_DIR17F = 4, /* 17 bits of eff. address. */
R_PARISC_DIR14R = 6, /* Right 14 bits of eff. address. */
R_PARISC_PCREL32 = 9, /* 32-bit rel. address. */
R_PARISC_PCREL21L = 10, /* Left 21 bits of rel. address. */
R_PARISC_PCREL17R = 11, /* Right 17 bits of rel. address. */
R_PARISC_PCREL17F = 12, /* 17 bits of rel. address. */
R_PARISC_PCREL14R = 14, /* Right 14 bits of rel. address. */
R_PARISC_DPREL21L = 18, /* Left 21 bits of rel. address. */
R_PARISC_DPREL14R = 22, /* Right 14 bits of rel. address. */
R_PARISC_GPREL21L = 26, /* GP-relative, left 21 bits. */
R_PARISC_GPREL14R = 30, /* GP-relative, right 14 bits. */
R_PARISC_LTOFF21L = 34, /* LT-relative, left 21 bits. */
R_PARISC_LTOFF14R = 38, /* LT-relative, right 14 bits. */
R_PARISC_SECREL32 = 41, /* 32 bits section rel. address. */
R_PARISC_SEGBASE = 48, /* No relocation, set segment base. */
R_PARISC_SEGREL32 = 49, /* 32 bits segment rel. address. */
R_PARISC_PLTOFF21L = 50, /* PLT rel. address, left 21 bits. */
R_PARISC_PLTOFF14R = 54, /* PLT rel. address, right 14 bits. */
R_PARISC_LTOFF_FPTR32 = 57, /* 32 bits LT-rel. function pointer. */
R_PARISC_LTOFF_FPTR21L = 58, /* LT-rel. fct ptr, left 21 bits. */
R_PARISC_LTOFF_FPTR14R = 62, /* LT-rel. fct ptr, right 14 bits. */
R_PARISC_FPTR64 = 64, /* 64 bits function address. */
R_PARISC_PLABEL32 = 65, /* 32 bits function address. */
R_PARISC_PLABEL21L = 66, /* Left 21 bits of fdesc address. */
R_PARISC_PLABEL14R = 70, /* Right 14 bits of fdesc address. */
R_PARISC_PCREL64 = 72, /* 64 bits PC-rel. address. */
R_PARISC_PCREL22F = 74, /* 22 bits PC-rel. address. */
R_PARISC_PCREL14WR = 75, /* PC-rel. address, right 14 bits. */
R_PARISC_PCREL14DR = 76, /* PC rel. address, right 14 bits. */
R_PARISC_PCREL16F = 77, /* 16 bits PC-rel. address. */
R_PARISC_PCREL16WF = 78, /* 16 bits PC-rel. address. */
R_PARISC_PCREL16DF = 79, /* 16 bits PC-rel. address. */
R_PARISC_DIR64 = 80, /* 64 bits of eff. address. */
R_PARISC_DIR14WR = 83, /* 14 bits of eff. address. */
R_PARISC_DIR14DR = 84, /* 14 bits of eff. address. */
R_PARISC_DIR16F = 85, /* 16 bits of eff. address. */
R_PARISC_DIR16WF = 86, /* 16 bits of eff. address. */
R_PARISC_DIR16DF = 87, /* 16 bits of eff. address. */
R_PARISC_GPREL64 = 88, /* 64 bits of GP-rel. address. */
R_PARISC_GPREL14WR = 91, /* GP-rel. address, right 14 bits. */
R_PARISC_GPREL14DR = 92, /* GP-rel. address, right 14 bits. */
R_PARISC_GPREL16F = 93, /* 16 bits GP-rel. address. */
R_PARISC_GPREL16WF = 94, /* 16 bits GP-rel. address. */
R_PARISC_GPREL16DF = 95, /* 16 bits GP-rel. address. */
R_PARISC_LTOFF64 = 96, /* 64 bits LT-rel. address. */
R_PARISC_LTOFF14WR = 99, /* LT-rel. address, right 14 bits. */
R_PARISC_LTOFF14DR = 100, /* LT-rel. address, right 14 bits. */
R_PARISC_LTOFF16F = 101, /* 16 bits LT-rel. address. */
R_PARISC_LTOFF16WF = 102, /* 16 bits LT-rel. address. */
R_PARISC_LTOFF16DF = 103, /* 16 bits LT-rel. address. */
R_PARISC_SECREL64 = 104, /* 64 bits section rel. address. */
R_PARISC_SEGREL64 = 112, /* 64 bits segment rel. address. */
R_PARISC_PLTOFF14WR = 115, /* PLT-rel. address, right 14 bits. */
R_PARISC_PLTOFF14DR = 116, /* PLT-rel. address, right 14 bits. */
R_PARISC_PLTOFF16F = 117, /* 16 bits LT-rel. address. */
R_PARISC_PLTOFF16WF = 118, /* 16 bits PLT-rel. address. */
R_PARISC_PLTOFF16DF = 119, /* 16 bits PLT-rel. address. */
R_PARISC_LTOFF_FPTR64 = 120, /* 64 bits LT-rel. function ptr. */
R_PARISC_LTOFF_FPTR14WR = 123, /* LT-rel. fct. ptr., right 14 bits. */
R_PARISC_LTOFF_FPTR14DR = 124, /* LT-rel. fct. ptr., right 14 bits. */
R_PARISC_LTOFF_FPTR16F = 125, /* 16 bits LT-rel. function ptr. */
R_PARISC_LTOFF_FPTR16WF = 126, /* 16 bits LT-rel. function ptr. */
R_PARISC_LTOFF_FPTR16DF = 127, /* 16 bits LT-rel. function ptr. */
R_PARISC_LORESERVE = 128,
R_PARISC_COPY = 128, /* Copy relocation. */
R_PARISC_IPLT = 129, /* Dynamic reloc, imported PLT */
R_PARISC_EPLT = 130, /* Dynamic reloc, exported PLT */
R_PARISC_TPREL32 = 153, /* 32 bits TP-rel. address. */
R_PARISC_TPREL21L = 154, /* TP-rel. address, left 21 bits. */
R_PARISC_TPREL14R = 158, /* TP-rel. address, right 14 bits. */
R_PARISC_LTOFF_TP21L = 162, /* LT-TP-rel. address, left 21 bits. */
R_PARISC_LTOFF_TP14R = 166, /* LT-TP-rel. address, right 14 bits.*/
R_PARISC_LTOFF_TP14F = 167, /* 14 bits LT-TP-rel. address. */
R_PARISC_TPREL64 = 216, /* 64 bits TP-rel. address. */
R_PARISC_TPREL14WR = 219, /* TP-rel. address, right 14 bits. */
R_PARISC_TPREL14DR = 220, /* TP-rel. address, right 14 bits. */
R_PARISC_TPREL16F = 221, /* 16 bits TP-rel. address. */
R_PARISC_TPREL16WF = 222, /* 16 bits TP-rel. address. */
R_PARISC_TPREL16DF = 223, /* 16 bits TP-rel. address. */
R_PARISC_LTOFF_TP64 = 224, /* 64 bits LT-TP-rel. address. */
R_PARISC_LTOFF_TP14WR = 227, /* LT-TP-rel. address, right 14 bits.*/
R_PARISC_LTOFF_TP14DR = 228, /* LT-TP-rel. address, right 14 bits.*/
R_PARISC_LTOFF_TP16F = 229, /* 16 bits LT-TP-rel. address. */
R_PARISC_LTOFF_TP16WF = 230, /* 16 bits LT-TP-rel. address. */
R_PARISC_LTOFF_TP16DF = 231, /* 16 bits LT-TP-rel. address. */
R_PARISC_GNU_VTENTRY = 232,
R_PARISC_GNU_VTINHERIT = 233,
R_PARISC_TLS_GD21L = 234, /* GD 21-bit left. */
R_PARISC_TLS_GD14R = 235, /* GD 14-bit right. */
R_PARISC_TLS_GDCALL = 236, /* GD call to __t_g_a. */
R_PARISC_TLS_LDM21L = 237, /* LD module 21-bit left. */
R_PARISC_TLS_LDM14R = 238, /* LD module 14-bit right. */
R_PARISC_TLS_LDMCALL = 239, /* LD module call to __t_g_a. */
R_PARISC_TLS_LDO21L = 240, /* LD offset 21-bit left. */
R_PARISC_TLS_LDO14R = 241, /* LD offset 14-bit right. */
R_PARISC_TLS_DTPMOD32 = 242, /* DTP module 32-bit. */
R_PARISC_TLS_DTPMOD64 = 243, /* DTP module 64-bit. */
R_PARISC_TLS_DTPOFF32 = 244, /* DTP offset 32-bit. */
R_PARISC_TLS_DTPOFF64 = 245, /* DTP offset 32-bit. */
R_PARISC_TLS_LE21L = R_PARISC_TPREL21L,
R_PARISC_TLS_LE14R = R_PARISC_TPREL14R,
R_PARISC_TLS_IE21L = R_PARISC_LTOFF_TP21L,
R_PARISC_TLS_IE14R = R_PARISC_LTOFF_TP14R,
R_PARISC_TLS_TPREL32 = R_PARISC_TPREL32,
R_PARISC_TLS_TPREL64 = R_PARISC_TPREL64,
R_PARISC_HIRESERVE = 255,
};
/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
enum {
PT_HP_TLS = (PT_LOOS + 0x0),
PT_HP_CORE_NONE = (PT_LOOS + 0x1),
PT_HP_CORE_VERSION = (PT_LOOS + 0x2),
PT_HP_CORE_KERNEL = (PT_LOOS + 0x3),
PT_HP_CORE_COMM = (PT_LOOS + 0x4),
PT_HP_CORE_PROC = (PT_LOOS + 0x5),
PT_HP_CORE_LOADABLE = (PT_LOOS + 0x6),
PT_HP_CORE_STACK = (PT_LOOS + 0x7),
PT_HP_CORE_SHM = (PT_LOOS + 0x8),
PT_HP_CORE_MMF = (PT_LOOS + 0x9),
PT_HP_PARALLEL = (PT_LOOS + 0x10),
PT_HP_FASTBIND = (PT_LOOS + 0x11),
PT_HP_OPT_ANNOT = (PT_LOOS + 0x12),
PT_HP_HSL_ANNOT = (PT_LOOS + 0x13),
PT_HP_STACK = (PT_LOOS + 0x14),
};
enum {
PT_PARISC_ARCHEXT = 0x70000000,
PT_PARISC_UNWIND = 0x70000001,
};
/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
enum {
PF_PARISC_SBP = 0x08000000,
};
enum {
PF_HP_PAGE_SIZE = 0x00100000,
PF_HP_FAR_SHARED = 0x00200000,
PF_HP_NEAR_SHARED = 0x00400000,
PF_HP_CODE = 0x01000000,
PF_HP_MODIFY = 0x02000000,
PF_HP_LAZYSWAP = 0x04000000,
PF_HP_SBP = 0x08000000,
};
/* Alpha specific definitions. */
/* Legal values for e_flags field of Elf64_Ehdr. */
enum {
EF_ALPHA_32BIT = 1, /* All addresses must be < 2GB. */
EF_ALPHA_CANRELAX = 2 /* Relocations for relaxing exist. */
};
/* Legal values for sh_type field of Elf64_Shdr. */
/* These two are primerily concerned with ECOFF debugging info. */
enum {
SHT_ALPHA_DEBUG = 0x70000001,
SHT_ALPHA_REGINFO = 0x70000002,
};
/* Legal values for sh_flags field of Elf64_Shdr. */
enum {
SHF_ALPHA_GPREL = 0x10000000,
};
/* Legal values for st_other field of Elf64_Sym. */
enum {
STO_ALPHA_NOPV = 0x80, /* No PV required. */
STO_ALPHA_STD_GPLOAD = 0x88, /* PV only used for initial ldgp. */
};
/* Alpha relocs. */
enum {
R_ALPHA_NONE = 0, /* No reloc */
R_ALPHA_REFLONG = 1, /* Direct 32 bit */
R_ALPHA_REFQUAD = 2, /* Direct 64 bit */
R_ALPHA_GPREL32 = 3, /* GP relative 32 bit */
R_ALPHA_LITERAL = 4, /* GP relative 16 bit w/optimization */
R_ALPHA_LITUSE = 5, /* Optimization hint for LITERAL */
R_ALPHA_GPDISP = 6, /* Add displacement to GP */
R_ALPHA_BRADDR = 7, /* PC+4 relative 23 bit shifted */
R_ALPHA_HINT = 8, /* PC+4 relative 16 bit shifted */
R_ALPHA_SREL16 = 9, /* PC relative 16 bit */
R_ALPHA_SREL32 = 10, /* PC relative 32 bit */
R_ALPHA_SREL64 = 11, /* PC relative 64 bit */
R_ALPHA_GPRELHIGH = 17, /* GP relative 32 bit, high 16 bits */
R_ALPHA_GPRELLOW = 18, /* GP relative 32 bit, low 16 bits */
R_ALPHA_GPREL16 = 19, /* GP relative 16 bit */
R_ALPHA_COPY = 24, /* Copy symbol at runtime */
R_ALPHA_GLOB_DAT = 25, /* Create GOT entry */
R_ALPHA_JMP_SLOT = 26, /* Create PLT entry */
R_ALPHA_RELATIVE = 27, /* Adjust by program base */
R_ALPHA_TLS_GD_HI = 28,
R_ALPHA_TLSGD = 29,
R_ALPHA_TLS_LDM = 30,
R_ALPHA_DTPMOD64 = 31,
R_ALPHA_GOTDTPREL = 32,
R_ALPHA_DTPREL64 = 33,
R_ALPHA_DTPRELHI = 34,
R_ALPHA_DTPRELLO = 35,
R_ALPHA_DTPREL16 = 36,
R_ALPHA_GOTTPREL = 37,
R_ALPHA_TPREL64 = 38,
R_ALPHA_TPRELHI = 39,
R_ALPHA_TPRELLO = 40,
R_ALPHA_TPREL16 = 41,
/* Keep this the last entry. */
R_ALPHA_NUM = 46,
};
/* Magic values of the LITUSE relocation addend. */
enum {
LITUSE_ALPHA_ADDR = 0,
LITUSE_ALPHA_BASE = 1,
LITUSE_ALPHA_BYTOFF = 2,
LITUSE_ALPHA_JSR = 3,
LITUSE_ALPHA_TLS_GD = 4,
LITUSE_ALPHA_TLS_LDM = 5,
};
/* Legal values for d_tag of Elf64_Dyn. */
enum {
DT_ALPHA_PLTRO = (DT_LOPROC + 0),
DT_ALPHA_NUM = 1,
};
/* PowerPC specific declarations */
/* Values for Elf32/64_Ehdr.e_flags. */
enum {
EF_PPC_EMB = 0x80000000, /* PowerPC embedded flag */
};
/* Cygnus local bits below */
enum {
EF_PPC_RELOCATABLE = 0x00010000, /* PowerPC -mrelocatable flag*/
EF_PPC_RELOCATABLE_LIB = 0x00008000, /* PowerPC -mrelocatable-lib flag */
};
/* PowerPC relocations defined by the ABIs */
enum {
R_PPC_NONE = 0,
R_PPC_ADDR32 = 1, /* 32bit absolute address */
R_PPC_ADDR24 = 2, /* 26bit address, 2 bits ignored. */
R_PPC_ADDR16 = 3, /* 16bit absolute address */
R_PPC_ADDR16_LO = 4, /* lower 16bit of absolute address */
R_PPC_ADDR16_HI = 5, /* high 16bit of absolute address */
R_PPC_ADDR16_HA = 6, /* adjusted high 16bit */
R_PPC_ADDR14 = 7, /* 16bit address, 2 bits ignored */
R_PPC_ADDR14_BRTAKEN = 8,
R_PPC_ADDR14_BRNTAKEN = 9,
R_PPC_REL24 = 10, /* PC relative 26 bit */
R_PPC_REL14 = 11, /* PC relative 16 bit */
R_PPC_REL14_BRTAKEN = 12,
R_PPC_REL14_BRNTAKEN = 13,
R_PPC_GOT16 = 14,
R_PPC_GOT16_LO = 15,
R_PPC_GOT16_HI = 16,
R_PPC_GOT16_HA = 17,
R_PPC_PLTREL24 = 18,
R_PPC_COPY = 19,
R_PPC_GLOB_DAT = 20,
R_PPC_JMP_SLOT = 21,
R_PPC_RELATIVE = 22,
R_PPC_LOCAL24PC = 23,
R_PPC_UADDR32 = 24,
R_PPC_UADDR16 = 25,
R_PPC_REL32 = 26,
R_PPC_PLT32 = 27,
R_PPC_PLTREL32 = 28,
R_PPC_PLT16_LO = 29,
R_PPC_PLT16_HI = 30,
R_PPC_PLT16_HA = 31,
R_PPC_SDAREL16 = 32,
R_PPC_SECTOFF = 33,
R_PPC_SECTOFF_LO = 34,
R_PPC_SECTOFF_HI = 35,
R_PPC_SECTOFF_HA = 36,
};
/* PowerPC relocations defined for the TLS access ABI. */
enum {
R_PPC_TLS = 67, /* none (sym+add)@tls */
R_PPC_DTPMOD32 = 68, /* word32 (sym+add)@dtpmod */
R_PPC_TPREL16 = 69, /* half16* (sym+add)@tprel */
R_PPC_TPREL16_LO = 70, /* half16 (sym+add)@tprel@l */
R_PPC_TPREL16_HI = 71, /* half16 (sym+add)@tprel@h */
R_PPC_TPREL16_HA = 72, /* half16 (sym+add)@tprel@ha */
R_PPC_TPREL32 = 73, /* word32 (sym+add)@tprel */
R_PPC_DTPREL16 = 74, /* half16* (sym+add)@dtprel */
R_PPC_DTPREL16_LO = 75, /* half16 (sym+add)@dtprel@l */
R_PPC_DTPREL16_HI = 76, /* half16 (sym+add)@dtprel@h */
R_PPC_DTPREL16_HA = 77, /* half16 (sym+add)@dtprel@ha */
R_PPC_DTPREL32 = 78, /* word32 (sym+add)@dtprel */
R_PPC_GOT_TLSGD16 = 79, /* half16* (sym+add)@got@tlsgd */
R_PPC_GOT_TLSGD16_LO = 80, /* half16 (sym+add)@got@tlsgd@l */
R_PPC_GOT_TLSGD16_HI = 81, /* half16 (sym+add)@got@tlsgd@h */
R_PPC_GOT_TLSGD16_HA = 82, /* half16 (sym+add)@got@tlsgd@ha */
R_PPC_GOT_TLSLD16 = 83, /* half16* (sym+add)@got@tlsld */
R_PPC_GOT_TLSLD16_LO = 84, /* half16 (sym+add)@got@tlsld@l */
R_PPC_GOT_TLSLD16_HI = 85, /* half16 (sym+add)@got@tlsld@h */
R_PPC_GOT_TLSLD16_HA = 86, /* half16 (sym+add)@got@tlsld@ha */
R_PPC_GOT_TPREL16 = 87, /* half16* (sym+add)@got@tprel */
R_PPC_GOT_TPREL16_LO = 88, /* half16 (sym+add)@got@tprel@l */
R_PPC_GOT_TPREL16_HI = 89, /* half16 (sym+add)@got@tprel@h */
R_PPC_GOT_TPREL16_HA = 90, /* half16 (sym+add)@got@tprel@ha */
R_PPC_GOT_DTPREL16 = 91, /* half16* (sym+add)@got@dtprel */
R_PPC_GOT_DTPREL16_LO = 92, /* half16* (sym+add)@got@dtprel@l */
R_PPC_GOT_DTPREL16_HI = 93, /* half16* (sym+add)@got@dtprel@h */
R_PPC_GOT_DTPREL16_HA = 94, /* half16* (sym+add)@got@dtprel@ha */
};
/* The remaining relocs are from the Embedded ELF ABI, and are not
in the SVR4 ELF ABI. */
enum {
R_PPC_EMB_NADDR32 = 101,
R_PPC_EMB_NADDR16 = 102,
R_PPC_EMB_NADDR16_LO = 103,
R_PPC_EMB_NADDR16_HI = 104,
R_PPC_EMB_NADDR16_HA = 105,
R_PPC_EMB_SDAI16 = 106,
R_PPC_EMB_SDA2I16 = 107,
R_PPC_EMB_SDA2REL = 108,
R_PPC_EMB_SDA21 = 109, /* 16 bit offset in SDA */
R_PPC_EMB_MRKREF = 110,
R_PPC_EMB_RELSEC16 = 111,
R_PPC_EMB_RELST_LO = 112,
R_PPC_EMB_RELST_HI = 113,
R_PPC_EMB_RELST_HA = 114,
R_PPC_EMB_BIT_FLD = 115,
R_PPC_EMB_RELSDA = 116, /* 16 bit relative offset in SDA */
};
/* Diab tool relocations. */
enum {
R_PPC_DIAB_SDA21_LO = 180, /* like EMB_SDA21, but lower 16 bit */
R_PPC_DIAB_SDA21_HI = 181, /* like EMB_SDA21, but high 16 bit */
R_PPC_DIAB_SDA21_HA = 182, /* like EMB_SDA21, adjusted high 16 */
R_PPC_DIAB_RELSDA_LO = 183, /* like EMB_RELSDA, but lower 16 bit */
R_PPC_DIAB_RELSDA_HI = 184, /* like EMB_RELSDA, but high 16 bit */
R_PPC_DIAB_RELSDA_HA = 185, /* like EMB_RELSDA, adjusted high 16 */
};
/* GNU extension to support local ifunc. */
enum {
R_PPC_IRELATIVE = 248,
};
/* GNU relocs used in PIC code sequences. */
enum {
R_PPC_REL16 = 249, /* half16 (sym+add-.) */
R_PPC_REL16_LO = 250, /* half16 (sym+add-.)@l */
R_PPC_REL16_HI = 251, /* half16 (sym+add-.)@h */
R_PPC_REL16_HA = 252, /* half16 (sym+add-.)@ha */
};
/* This is a phony reloc to handle any old fashioned TOC16 references
that may still be in object files. */
enum {
R_PPC_TOC16 = 255,
};
/* PowerPC specific values for the Dyn d_tag field. */
enum {
DT_PPC_GOT = (DT_LOPROC + 0),
DT_PPC_NUM = 1,
};
/* PowerPC64 relocations defined by the ABIs */
enum {
R_PPC64_NONE = R_PPC_NONE,
R_PPC64_ADDR32 = R_PPC_ADDR32, /* 32bit absolute address */
R_PPC64_ADDR24 = R_PPC_ADDR24, /* 26bit address, word aligned */
R_PPC64_ADDR16 = R_PPC_ADDR16, /* 16bit absolute address */
R_PPC64_ADDR16_LO = R_PPC_ADDR16_LO, /* lower 16bits of address */
R_PPC64_ADDR16_HI = R_PPC_ADDR16_HI, /* high 16bits of address. */
R_PPC64_ADDR16_HA = R_PPC_ADDR16_HA, /* adjusted high 16bits. */
R_PPC64_ADDR14 = R_PPC_ADDR14, /* 16bit address, word aligned */
R_PPC64_ADDR14_BRTAKEN = R_PPC_ADDR14_BRTAKEN,
R_PPC64_ADDR14_BRNTAKEN = R_PPC_ADDR14_BRNTAKEN,
R_PPC64_REL24 = R_PPC_REL24, /* PC-rel. 26 bit, word aligned */
R_PPC64_REL14 = R_PPC_REL14, /* PC relative 16 bit */
R_PPC64_REL14_BRTAKEN = R_PPC_REL14_BRTAKEN,
R_PPC64_REL14_BRNTAKEN = R_PPC_REL14_BRNTAKEN,
R_PPC64_GOT16 = R_PPC_GOT16,
R_PPC64_GOT16_LO = R_PPC_GOT16_LO,
R_PPC64_GOT16_HI = R_PPC_GOT16_HI,
R_PPC64_GOT16_HA = R_PPC_GOT16_HA,
R_PPC64_COPY = R_PPC_COPY,
R_PPC64_GLOB_DAT = R_PPC_GLOB_DAT,
R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT,
R_PPC64_RELATIVE = R_PPC_RELATIVE,
R_PPC64_UADDR32 = R_PPC_UADDR32,
R_PPC64_UADDR16 = R_PPC_UADDR16,
R_PPC64_REL32 = R_PPC_REL32,
R_PPC64_PLT32 = R_PPC_PLT32,
R_PPC64_PLTREL32 = R_PPC_PLTREL32,
R_PPC64_PLT16_LO = R_PPC_PLT16_LO,
R_PPC64_PLT16_HI = R_PPC_PLT16_HI,
R_PPC64_PLT16_HA = R_PPC_PLT16_HA,
R_PPC64_SECTOFF = R_PPC_SECTOFF,
R_PPC64_SECTOFF_LO = R_PPC_SECTOFF_LO,
R_PPC64_SECTOFF_HI = R_PPC_SECTOFF_HI,
R_PPC64_SECTOFF_HA = R_PPC_SECTOFF_HA,
R_PPC64_ADDR30 = 37, /* word30 (S + A - P) >> 2 */
R_PPC64_ADDR64 = 38, /* doubleword64 S + A */
R_PPC64_ADDR16_HIGHER = 39, /* half16 #higher(S + A) */
R_PPC64_ADDR16_HIGHERA = 40, /* half16 #highera(S + A) */
R_PPC64_ADDR16_HIGHEST = 41, /* half16 #highest(S + A) */
R_PPC64_ADDR16_HIGHESTA = 42, /* half16 #highesta(S + A) */
R_PPC64_UADDR64 = 43, /* doubleword64 S + A */
R_PPC64_REL64 = 44, /* doubleword64 S + A - P */
R_PPC64_PLT64 = 45, /* doubleword64 L + A */
R_PPC64_PLTREL64 = 46, /* doubleword64 L + A - P */
R_PPC64_TOC16 = 47, /* half16* S + A - .TOC */
R_PPC64_TOC16_LO = 48, /* half16 #lo(S + A - .TOC.) */
R_PPC64_TOC16_HI = 49, /* half16 #hi(S + A - .TOC.) */
R_PPC64_TOC16_HA = 50, /* half16 #ha(S + A - .TOC.) */
R_PPC64_TOC = 51, /* doubleword64 .TOC */
R_PPC64_PLTGOT16 = 52, /* half16* M + A */
R_PPC64_PLTGOT16_LO = 53, /* half16 #lo(M + A) */
R_PPC64_PLTGOT16_HI = 54, /* half16 #hi(M + A) */
R_PPC64_PLTGOT16_HA = 55, /* half16 #ha(M + A) */
R_PPC64_ADDR16_DS = 56, /* half16ds* (S + A) >> 2 */
R_PPC64_ADDR16_LO_DS = 57, /* half16ds #lo(S + A) >> 2 */
R_PPC64_GOT16_DS = 58, /* half16ds* (G + A) >> 2 */
R_PPC64_GOT16_LO_DS = 59, /* half16ds #lo(G + A) >> 2 */
R_PPC64_PLT16_LO_DS = 60, /* half16ds #lo(L + A) >> 2 */
R_PPC64_SECTOFF_DS = 61, /* half16ds* (R + A) >> 2 */
R_PPC64_SECTOFF_LO_DS = 62, /* half16ds #lo(R + A) >> 2 */
R_PPC64_TOC16_DS = 63, /* half16ds* (S + A - .TOC.) >> 2 */
R_PPC64_TOC16_LO_DS = 64, /* half16ds #lo(S + A - .TOC.) >> 2 */
R_PPC64_PLTGOT16_DS = 65, /* half16ds* (M + A) >> 2 */
R_PPC64_PLTGOT16_LO_DS = 66, /* half16ds #lo(M + A) >> 2 */
};
/* PowerPC64 relocations defined for the TLS access ABI. */
enum {
R_PPC64_TLS = 67, /* none (sym+add)@tls */
R_PPC64_DTPMOD64 = 68, /* doubleword64 (sym+add)@dtpmod */
R_PPC64_TPREL16 = 69, /* half16* (sym+add)@tprel */
R_PPC64_TPREL16_LO = 70, /* half16 (sym+add)@tprel@l */
R_PPC64_TPREL16_HI = 71, /* half16 (sym+add)@tprel@h */
R_PPC64_TPREL16_HA = 72, /* half16 (sym+add)@tprel@ha */
R_PPC64_TPREL64 = 73, /* doubleword64 (sym+add)@tprel */
R_PPC64_DTPREL16 = 74, /* half16* (sym+add)@dtprel */
R_PPC64_DTPREL16_LO = 75, /* half16 (sym+add)@dtprel@l */
R_PPC64_DTPREL16_HI = 76, /* half16 (sym+add)@dtprel@h */
R_PPC64_DTPREL16_HA = 77, /* half16 (sym+add)@dtprel@ha */
R_PPC64_DTPREL64 = 78, /* doubleword64 (sym+add)@dtprel */
R_PPC64_GOT_TLSGD16 = 79, /* half16* (sym+add)@got@tlsgd */
R_PPC64_GOT_TLSGD16_LO = 80, /* half16 (sym+add)@got@tlsgd@l */
R_PPC64_GOT_TLSGD16_HI = 81, /* half16 (sym+add)@got@tlsgd@h */
R_PPC64_GOT_TLSGD16_HA = 82, /* half16 (sym+add)@got@tlsgd@ha */
R_PPC64_GOT_TLSLD16 = 83, /* half16* (sym+add)@got@tlsld */
R_PPC64_GOT_TLSLD16_LO = 84, /* half16 (sym+add)@got@tlsld@l */
R_PPC64_GOT_TLSLD16_HI = 85, /* half16 (sym+add)@got@tlsld@h */
R_PPC64_GOT_TLSLD16_HA = 86, /* half16 (sym+add)@got@tlsld@ha */
R_PPC64_GOT_TPREL16_DS = 87, /* half16ds* (sym+add)@got@tprel */
R_PPC64_GOT_TPREL16_LO_DS = 88, /* half16ds (sym+add)@got@tprel@l */
R_PPC64_GOT_TPREL16_HI = 89, /* half16 (sym+add)@got@tprel@h */
R_PPC64_GOT_TPREL16_HA = 90, /* half16 (sym+add)@got@tprel@ha */
R_PPC64_GOT_DTPREL16_DS = 91, /* half16ds* (sym+add)@got@dtprel */
R_PPC64_GOT_DTPREL16_LO_DS = 92, /* half16ds (sym+add)@got@dtprel@l */
R_PPC64_GOT_DTPREL16_HI = 93, /* half16 (sym+add)@got@dtprel@h */
R_PPC64_GOT_DTPREL16_HA = 94, /* half16 (sym+add)@got@dtprel@ha */
R_PPC64_TPREL16_DS = 95, /* half16ds* (sym+add)@tprel */
R_PPC64_TPREL16_LO_DS = 96, /* half16ds (sym+add)@tprel@l */
R_PPC64_TPREL16_HIGHER = 97, /* half16 (sym+add)@tprel@higher */
R_PPC64_TPREL16_HIGHERA = 98, /* half16 (sym+add)@tprel@highera */
R_PPC64_TPREL16_HIGHEST = 99, /* half16 (sym+add)@tprel@highest */
R_PPC64_TPREL16_HIGHESTA = 100, /* half16 (sym+add)@tprel@highesta */
R_PPC64_DTPREL16_DS = 101, /* half16ds* (sym+add)@dtprel */
R_PPC64_DTPREL16_LO_DS = 102, /* half16ds (sym+add)@dtprel@l */
R_PPC64_DTPREL16_HIGHER = 103, /* half16 (sym+add)@dtprel@higher */
R_PPC64_DTPREL16_HIGHERA = 104, /* half16 (sym+add)@dtprel@highera */
R_PPC64_DTPREL16_HIGHEST = 105, /* half16 (sym+add)@dtprel@highest */
R_PPC64_DTPREL16_HIGHESTA = 106, /* half16 (sym+add)@dtprel@highesta */
};
/* GNU extension to support local ifunc. */
enum {
R_PPC64_JMP_IREL = 247,
R_PPC64_IRELATIVE = 248,
R_PPC64_REL16 = 249, /* half16 (sym+add-.) */
R_PPC64_REL16_LO = 250, /* half16 (sym+add-.)@l */
R_PPC64_REL16_HI = 251, /* half16 (sym+add-.)@h */
R_PPC64_REL16_HA = 252, /* half16 (sym+add-.)@ha */
};
/* PowerPC64 specific values for the Dyn d_tag field. */
enum {
DT_PPC64_GLINK = (DT_LOPROC + 0),
DT_PPC64_OPD = (DT_LOPROC + 1),
DT_PPC64_OPDSZ = (DT_LOPROC + 2),
DT_PPC64_NUM = 3,
};
/* ARM specific declarations */
/* Processor specific flags for the ELF header e_flags field. */
enum {
EF_ARM_RELEXEC = 0x01,
EF_ARM_HASENTRY = 0x02,
EF_ARM_INTERWORK = 0x04,
EF_ARM_APCS_26 = 0x08,
EF_ARM_APCS_FLOAT = 0x10,
EF_ARM_PIC = 0x20,
EF_ARM_ALIGN8 = 0x40, /* 8-bit structure alignment is in use */
EF_ARM_NEW_ABI = 0x80,
EF_ARM_OLD_ABI = 0x100,
EF_ARM_SOFT_FLOAT = 0x200,
EF_ARM_VFP_FLOAT = 0x400,
EF_ARM_MAVERICK_FLOAT = 0x800,
};
/* Other constants defined in the ARM ELF spec. version B-01. */
/* NB. These conflict with values defined above. */
enum {
EF_ARM_SYMSARESORTED = 0x04,
EF_ARM_DYNSYMSUSESEGIDX = 0x08,
EF_ARM_MAPSYMSFIRST = 0x10,
EF_ARM_EABIMASK = 0XFF000000
};
/* Constants defined in AAELF. */
enum {
EF_ARM_BE8 = 0x00800000,
EF_ARM_LE8 = 0x00400000,
};
template
constexpr T EF_ARM_EABI_VERSION(T flags) {
return flags & EF_ARM_EABIMASK;
}
enum {
EF_ARM_EABI_UNKNOWN = 0x00000000,
EF_ARM_EABI_VER1 = 0x01000000,
EF_ARM_EABI_VER2 = 0x02000000,
EF_ARM_EABI_VER3 = 0x03000000,
EF_ARM_EABI_VER4 = 0x04000000,
EF_ARM_EABI_VER5 = 0x05000000,
};
/* Additional symbol types for Thumb. */
enum {
STT_ARM_TFUNC = STT_LOPROC, /* A Thumb function. */
STT_ARM_16BIT = STT_HIPROC, /* A Thumb label. */
};
/* ARM-specific values for sh_flags */
enum {
SHF_ARM_ENTRYSECT = 0x10000000, /* Section contains an entry point */
SHF_ARM_COMDEF = 0x80000000, /* Section may be multiply defined in the input to a link step. */
};
/* ARM-specific program header flags */
enum {
PF_ARM_SB = 0x10000000, /* Segment contains the location addressed by the static base. */
PF_ARM_PI = 0x20000000, /* Position-independent segment. */
PF_ARM_ABS = 0x40000000, /* Absolute segment. */
};
/* Processor specific values for the Phdr p_type field. */
enum {
PT_ARM_EXIDX = (PT_LOPROC + 1), /* ARM unwind segment. */
};
/* Processor specific values for the Shdr sh_type field. */
enum {
SHT_ARM_EXIDX = (SHT_LOPROC + 1), /* ARM unwind section. */
SHT_ARM_PREEMPTMAP = (SHT_LOPROC + 2), /* Preemption details. */
SHT_ARM_ATTRIBUTES = (SHT_LOPROC + 3), /* ARM attributes section. */
};
/* ARM relocs. */
enum {
R_ARM_NONE = 0, /* No reloc */
R_ARM_PC24 = 1, /* PC relative 26 bit branch */
R_ARM_ABS32 = 2, /* Direct 32 bit */
R_ARM_REL32 = 3, /* PC relative 32 bit */
R_ARM_PC13 = 4,
R_ARM_ABS16 = 5, /* Direct 16 bit */
R_ARM_ABS12 = 6, /* Direct 12 bit */
R_ARM_THM_ABS5 = 7,
R_ARM_ABS8 = 8, /* Direct 8 bit */
R_ARM_SBREL32 = 9,
R_ARM_THM_PC22 = 10,
R_ARM_THM_PC8 = 11,
R_ARM_AMP_VCALL9 = 12,
R_ARM_SWI24 = 13, /* Obsolete static relocation. */
R_ARM_TLS_DESC = 13, /* Dynamic relocation. */
R_ARM_THM_SWI8 = 14,
R_ARM_XPC25 = 15,
R_ARM_THM_XPC22 = 16,
R_ARM_TLS_DTPMOD32 = 17, /* ID of module containing symbol */
R_ARM_TLS_DTPOFF32 = 18, /* Offset in TLS block */
R_ARM_TLS_TPOFF32 = 19, /* Offset in static TLS block */
R_ARM_COPY = 20, /* Copy symbol at runtime */
R_ARM_GLOB_DAT = 21, /* Create GOT entry */
R_ARM_JUMP_SLOT = 22, /* Create PLT entry */
R_ARM_RELATIVE = 23, /* Adjust by program base */
R_ARM_GOTOFF = 24, /* 32 bit offset to GOT */
R_ARM_GOTPC = 25, /* 32 bit PC relative offset to GOT */
R_ARM_GOT32 = 26, /* 32 bit GOT entry */
R_ARM_PLT32 = 27, /* 32 bit PLT address */
R_ARM_ALU_PCREL_7_0 = 32,
R_ARM_ALU_PCREL_15_8 = 33,
R_ARM_ALU_PCREL_23_15 = 34,
R_ARM_LDR_SBREL_11_0 = 35,
R_ARM_ALU_SBREL_19_12 = 36,
R_ARM_ALU_SBREL_27_20 = 37,
R_ARM_TLS_GOTDESC = 90,
R_ARM_TLS_CALL = 91,
R_ARM_TLS_DESCSEQ = 92,
R_ARM_THM_TLS_CALL = 93,
R_ARM_GNU_VTENTRY = 100,
R_ARM_GNU_VTINHERIT = 101,
R_ARM_THM_PC11 = 102, /* thumb unconditional branch */
R_ARM_THM_PC9 = 103, /* thumb conditional branch */
R_ARM_TLS_GD32 = 104, /* PC-rel 32 bit for global dynamic thread local data */
R_ARM_TLS_LDM32 = 105, /* PC-rel 32 bit for local dynamic thread local data */
R_ARM_TLS_LDO32 = 106, /* 32 bit offset relative to TLS block */
R_ARM_TLS_IE32 = 107, /* PC-rel 32 bit for GOT entry of static TLS block offset */
R_ARM_TLS_LE32 = 108, /* 32 bit offset relative to static TLS block */
R_ARM_THM_TLS_DESCSEQ = 129,
R_ARM_IRELATIVE = 160,
R_ARM_RXPC25 = 249,
R_ARM_RSBREL32 = 250,
R_ARM_THM_RPC22 = 251,
R_ARM_RREL32 = 252,
R_ARM_RABS22 = 253,
R_ARM_RPC24 = 254,
R_ARM_RBASE = 255,
/* Keep this the last entry. */
R_ARM_NUM = 256,
};
/* IA-64 specific declarations. */
/* Processor specific flags for the Ehdr e_flags field. */
enum {
EF_IA_64_MASKOS = 0x0000000f, /* os-specific flags */
EF_IA_64_ABI64 = 0x00000010, /* 64-bit ABI */
EF_IA_64_ARCH = 0xff000000, /* arch. version mask */
};
/* Processor specific values for the Phdr p_type field. */
enum {
PT_IA_64_ARCHEXT = (PT_LOPROC + 0), /* arch extension bits */
PT_IA_64_UNWIND = (PT_LOPROC + 1), /* ia64 unwind bits */
PT_IA_64_HP_OPT_ANOT = (PT_LOOS + 0x12),
PT_IA_64_HP_HSL_ANOT = (PT_LOOS + 0x13),
PT_IA_64_HP_STACK = (PT_LOOS + 0x14),
};
/* Processor specific flags for the Phdr p_flags field. */
enum {
PF_IA_64_NORECOV = 0x80000000, /* spec insns w/o recovery */
};
/* Processor specific values for the Shdr sh_type field. */
enum {
SHT_IA_64_EXT = (SHT_LOPROC + 0), /* extension bits */
SHT_IA_64_UNWIND = (SHT_LOPROC + 1), /* unwind bits */
};
/* Processor specific flags for the Shdr sh_flags field. */
enum {
SHF_IA_64_SHORT = 0x10000000, /* section near gp */
SHF_IA_64_NORECOV = 0x20000000, /* spec insns w/o recovery */
};
/* Processor specific values for the Dyn d_tag field. */
enum {
DT_IA_64_PLT_RESERVE = (DT_LOPROC + 0),
DT_IA_64_NUM = 1,
};
/* IA-64 relocations. */
enum {
R_IA64_NONE = 0x00, /* none */
R_IA64_IMM14 = 0x21, /* symbol + addend, add imm14 */
R_IA64_IMM22 = 0x22, /* symbol + addend, add imm22 */
R_IA64_IMM64 = 0x23, /* symbol + addend, mov imm64 */
R_IA64_DIR32MSB = 0x24, /* symbol + addend, data4 MSB */
R_IA64_DIR32LSB = 0x25, /* symbol + addend, data4 LSB */
R_IA64_DIR64MSB = 0x26, /* symbol + addend, data8 MSB */
R_IA64_DIR64LSB = 0x27, /* symbol + addend, data8 LSB */
R_IA64_GPREL22 = 0x2a, /* @gprel(sym + add), add imm22 */
R_IA64_GPREL64I = 0x2b, /* @gprel(sym + add), mov imm64 */
R_IA64_GPREL32MSB = 0x2c, /* @gprel(sym + add), data4 MSB */
R_IA64_GPREL32LSB = 0x2d, /* @gprel(sym + add), data4 LSB */
R_IA64_GPREL64MSB = 0x2e, /* @gprel(sym + add), data8 MSB */
R_IA64_GPREL64LSB = 0x2f, /* @gprel(sym + add), data8 LSB */
R_IA64_LTOFF22 = 0x32, /* @ltoff(sym + add), add imm22 */
R_IA64_LTOFF64I = 0x33, /* @ltoff(sym + add), mov imm64 */
R_IA64_PLTOFF22 = 0x3a, /* @pltoff(sym + add), add imm22 */
R_IA64_PLTOFF64I = 0x3b, /* @pltoff(sym + add), mov imm64 */
R_IA64_PLTOFF64MSB = 0x3e, /* @pltoff(sym + add), data8 MSB */
R_IA64_PLTOFF64LSB = 0x3f, /* @pltoff(sym + add), data8 LSB */
R_IA64_FPTR64I = 0x43, /* @fptr(sym + add), mov imm64 */
R_IA64_FPTR32MSB = 0x44, /* @fptr(sym + add), data4 MSB */
R_IA64_FPTR32LSB = 0x45, /* @fptr(sym + add), data4 LSB */
R_IA64_FPTR64MSB = 0x46, /* @fptr(sym + add), data8 MSB */
R_IA64_FPTR64LSB = 0x47, /* @fptr(sym + add), data8 LSB */
R_IA64_PCREL60B = 0x48, /* @pcrel(sym + add), brl */
R_IA64_PCREL21B = 0x49, /* @pcrel(sym + add), ptb, call */
R_IA64_PCREL21M = 0x4a, /* @pcrel(sym + add), chk.s */
R_IA64_PCREL21F = 0x4b, /* @pcrel(sym + add), fchkf */
R_IA64_PCREL32MSB = 0x4c, /* @pcrel(sym + add), data4 MSB */
R_IA64_PCREL32LSB = 0x4d, /* @pcrel(sym + add), data4 LSB */
R_IA64_PCREL64MSB = 0x4e, /* @pcrel(sym + add), data8 MSB */
R_IA64_PCREL64LSB = 0x4f, /* @pcrel(sym + add), data8 LSB */
R_IA64_LTOFF_FPTR22 = 0x52, /* @ltoff(@fptr(s+a)), imm22 */
R_IA64_LTOFF_FPTR64I = 0x53, /* @ltoff(@fptr(s+a)), imm64 */
R_IA64_LTOFF_FPTR32MSB = 0x54, /* @ltoff(@fptr(s+a)), data4 MSB */
R_IA64_LTOFF_FPTR32LSB = 0x55, /* @ltoff(@fptr(s+a)), data4 LSB */
R_IA64_LTOFF_FPTR64MSB = 0x56, /* @ltoff(@fptr(s+a)), data8 MSB */
R_IA64_LTOFF_FPTR64LSB = 0x57, /* @ltoff(@fptr(s+a)), data8 LSB */
R_IA64_SEGREL32MSB = 0x5c, /* @segrel(sym + add), data4 MSB */
R_IA64_SEGREL32LSB = 0x5d, /* @segrel(sym + add), data4 LSB */
R_IA64_SEGREL64MSB = 0x5e, /* @segrel(sym + add), data8 MSB */
R_IA64_SEGREL64LSB = 0x5f, /* @segrel(sym + add), data8 LSB */
R_IA64_SECREL32MSB = 0x64, /* @secrel(sym + add), data4 MSB */
R_IA64_SECREL32LSB = 0x65, /* @secrel(sym + add), data4 LSB */
R_IA64_SECREL64MSB = 0x66, /* @secrel(sym + add), data8 MSB */
R_IA64_SECREL64LSB = 0x67, /* @secrel(sym + add), data8 LSB */
R_IA64_REL32MSB = 0x6c, /* data 4 + REL */
R_IA64_REL32LSB = 0x6d, /* data 4 + REL */
R_IA64_REL64MSB = 0x6e, /* data 8 + REL */
R_IA64_REL64LSB = 0x6f, /* data 8 + REL */
R_IA64_LTV32MSB = 0x74, /* symbol + addend, data4 MSB */
R_IA64_LTV32LSB = 0x75, /* symbol + addend, data4 LSB */
R_IA64_LTV64MSB = 0x76, /* symbol + addend, data8 MSB */
R_IA64_LTV64LSB = 0x77, /* symbol + addend, data8 LSB */
R_IA64_PCREL21BI = 0x79, /* @pcrel(sym + add), 21bit inst */
R_IA64_PCREL22 = 0x7a, /* @pcrel(sym + add), 22bit inst */
R_IA64_PCREL64I = 0x7b, /* @pcrel(sym + add), 64bit inst */
R_IA64_IPLTMSB = 0x80, /* dynamic reloc, imported PLT, MSB */
R_IA64_IPLTLSB = 0x81, /* dynamic reloc, imported PLT, LSB */
R_IA64_COPY = 0x84, /* copy relocation */
R_IA64_SUB = 0x85, /* Addend and symbol difference */
R_IA64_LTOFF22X = 0x86, /* LTOFF22, relaxable. */
R_IA64_LDXMOV = 0x87, /* Use of LTOFF22X. */
R_IA64_TPREL14 = 0x91, /* @tprel(sym + add), imm14 */
R_IA64_TPREL22 = 0x92, /* @tprel(sym + add), imm22 */
R_IA64_TPREL64I = 0x93, /* @tprel(sym + add), imm64 */
R_IA64_TPREL64MSB = 0x96, /* @tprel(sym + add), data8 MSB */
R_IA64_TPREL64LSB = 0x97, /* @tprel(sym + add), data8 LSB */
R_IA64_LTOFF_TPREL22 = 0x9a, /* @ltoff(@tprel(s+a)), imm2 */
R_IA64_DTPMOD64MSB = 0xa6, /* @dtpmod(sym + add), data8 MSB */
R_IA64_DTPMOD64LSB = 0xa7, /* @dtpmod(sym + add), data8 LSB */
R_IA64_LTOFF_DTPMOD22 = 0xaa, /* @ltoff(@dtpmod(sym + add)), imm22 */
R_IA64_DTPREL14 = 0xb1, /* @dtprel(sym + add), imm14 */
R_IA64_DTPREL22 = 0xb2, /* @dtprel(sym + add), imm22 */
R_IA64_DTPREL64I = 0xb3, /* @dtprel(sym + add), imm64 */
R_IA64_DTPREL32MSB = 0xb4, /* @dtprel(sym + add), data4 MSB */
R_IA64_DTPREL32LSB = 0xb5, /* @dtprel(sym + add), data4 LSB */
R_IA64_DTPREL64MSB = 0xb6, /* @dtprel(sym + add), data8 MSB */
R_IA64_DTPREL64LSB = 0xb7, /* @dtprel(sym + add), data8 LSB */
R_IA64_LTOFF_DTPREL22 = 0xba, /* @ltoff(@dtprel(s+a)), imm22 */
};
/* SH specific declarations */
/* Processor specific flags for the ELF header e_flags field. */
enum {
EF_SH_MACH_MASK = 0x1f,
EF_SH_UNKNOWN = 0x0,
EF_SH1 = 0x1,
EF_SH2 = 0x2,
EF_SH3 = 0x3,
EF_SH_DSP = 0x4,
EF_SH3_DSP = 0x5,
EF_SH4AL_DSP = 0x6,
EF_SH3E = 0x8,
EF_SH4 = 0x9,
EF_SH2E = 0xb,
EF_SH4A = 0xc,
EF_SH2A = 0xd,
EF_SH4_NOFPU = 0x10,
EF_SH4A_NOFPU = 0x11,
EF_SH4_NOMMU_NOFPU = 0x12,
EF_SH2A_NOFPU = 0x13,
EF_SH3_NOMMU = 0x14,
EF_SH2A_SH4_NOFPU = 0x15,
EF_SH2A_SH3_NOFPU = 0x16,
EF_SH2A_SH4 = 0x17,
EF_SH2A_SH3E = 0x18,
};
/* SH relocs. */
enum {
R_SH_NONE = 0,
R_SH_DIR32 = 1,
R_SH_REL32 = 2,
R_SH_DIR8WPN = 3,
R_SH_IND12W = 4,
R_SH_DIR8WPL = 5,
R_SH_DIR8WPZ = 6,
R_SH_DIR8BP = 7,
R_SH_DIR8W = 8,
R_SH_DIR8L = 9,
R_SH_SWITCH16 = 25,
R_SH_SWITCH32 = 26,
R_SH_USES = 27,
R_SH_COUNT = 28,
R_SH_ALIGN = 29,
R_SH_CODE = 30,
R_SH_DATA = 31,
R_SH_LABEL = 32,
R_SH_SWITCH8 = 33,
R_SH_GNU_VTINHERIT = 34,
R_SH_GNU_VTENTRY = 35,
R_SH_TLS_GD_32 = 144,
R_SH_TLS_LD_32 = 145,
R_SH_TLS_LDO_32 = 146,
R_SH_TLS_IE_32 = 147,
R_SH_TLS_LE_32 = 148,
R_SH_TLS_DTPMOD32 = 149,
R_SH_TLS_DTPOFF32 = 150,
R_SH_TLS_TPOFF32 = 151,
R_SH_GOT32 = 160,
R_SH_PLT32 = 161,
R_SH_COPY = 162,
R_SH_GLOB_DAT = 163,
R_SH_JMP_SLOT = 164,
R_SH_RELATIVE = 165,
R_SH_GOTOFF = 166,
R_SH_GOTPC = 167,
/* Keep this the last entry. */
R_SH_NUM = 256,
};
/* S/390 specific definitions. */
/* Valid values for the e_flags field. */
enum {
EF_S390_HIGH_GPRS = 0x00000001, /* High GPRs kernel facility needed. */
};
/* Additional s390 relocs */
enum {
R_390_NONE = 0, /* No reloc. */
R_390_8 = 1, /* Direct 8 bit. */
R_390_12 = 2, /* Direct 12 bit. */
R_390_16 = 3, /* Direct 16 bit. */
R_390_32 = 4, /* Direct 32 bit. */
R_390_PC32 = 5, /* PC relative 32 bit. */
R_390_GOT12 = 6, /* 12 bit GOT offset. */
R_390_GOT32 = 7, /* 32 bit GOT offset. */
R_390_PLT32 = 8, /* 32 bit PC relative PLT address. */
R_390_COPY = 9, /* Copy symbol at runtime. */
R_390_GLOB_DAT = 10, /* Create GOT entry. */
R_390_JMP_SLOT = 11, /* Create PLT entry. */
R_390_RELATIVE = 12, /* Adjust by program base. */
R_390_GOTOFF32 = 13, /* 32 bit offset to GOT. */
R_390_GOTPC = 14, /* 32 bit PC relative offset to GOT. */
R_390_GOT16 = 15, /* 16 bit GOT offset. */
R_390_PC16 = 16, /* PC relative 16 bit. */
R_390_PC16DBL = 17, /* PC relative 16 bit shifted by 1. */
R_390_PLT16DBL = 18, /* 16 bit PC rel. PLT shifted by 1. */
R_390_PC32DBL = 19, /* PC relative 32 bit shifted by 1. */
R_390_PLT32DBL = 20, /* 32 bit PC rel. PLT shifted by 1. */
R_390_GOTPCDBL = 21, /* 32 bit PC rel. GOT shifted by 1. */
R_390_64 = 22, /* Direct 64 bit. */
R_390_PC64 = 23, /* PC relative 64 bit. */
R_390_GOT64 = 24, /* 64 bit GOT offset. */
R_390_PLT64 = 25, /* 64 bit PC relative PLT address. */
R_390_GOTENT = 26, /* 32 bit PC rel. to GOT entry >> 1. */
R_390_GOTOFF16 = 27, /* 16 bit offset to GOT. */
R_390_GOTOFF64 = 28, /* 64 bit offset to GOT. */
R_390_GOTPLT12 = 29, /* 12 bit offset to jump slot. */
R_390_GOTPLT16 = 30, /* 16 bit offset to jump slot. */
R_390_GOTPLT32 = 31, /* 32 bit offset to jump slot. */
R_390_GOTPLT64 = 32, /* 64 bit offset to jump slot. */
R_390_GOTPLTENT = 33, /* 32 bit rel. offset to jump slot. */
R_390_PLTOFF16 = 34, /* 16 bit offset from GOT to PLT. */
R_390_PLTOFF32 = 35, /* 32 bit offset from GOT to PLT. */
R_390_PLTOFF64 = 36, /* 16 bit offset from GOT to PLT. */
R_390_TLS_LOAD = 37, /* Tag for load insn in TLS code. */
R_390_TLS_GDCALL = 38, /* Tag for function call in general dynamic TLS code. */
R_390_TLS_LDCALL = 39, /* Tag for function call in local dynamic TLS code. */
R_390_TLS_GD32 = 40, /* Direct 32 bit for general dynamic thread local data. */
R_390_TLS_GD64 = 41, /* Direct 64 bit for general dynamic thread local data. */
R_390_TLS_GOTIE12 = 42, /* 12 bit GOT offset for static TLS block offset. */
R_390_TLS_GOTIE32 = 43, /* 32 bit GOT offset for static TLS block offset. */
R_390_TLS_GOTIE64 = 44, /* 64 bit GOT offset for static TLS block offset. */
R_390_TLS_LDM32 = 45, /* Direct 32 bit for local dynamic thread local data in LE code. */
R_390_TLS_LDM64 = 46, /* Direct 64 bit for local dynamic thread local data in LE code. */
R_390_TLS_IE32 = 47, /* 32 bit address of GOT entry for negated static TLS block offset. */
R_390_TLS_IE64 = 48, /* 64 bit address of GOT entry for negated static TLS block offset. */
R_390_TLS_IEENT = 49, /* 32 bit rel. offset to GOT entry for negated static TLS block offset. */
R_390_TLS_LE32 = 50, /* 32 bit negated offset relative to static TLS block. */
R_390_TLS_LE64 = 51, /* 64 bit negated offset relative to static TLS block. */
R_390_TLS_LDO32 = 52, /* 32 bit offset relative to TLS block. */
R_390_TLS_LDO64 = 53, /* 64 bit offset relative to TLS block. */
R_390_TLS_DTPMOD = 54, /* ID of module containing symbol. */
R_390_TLS_DTPOFF = 55, /* Offset in TLS block. */
R_390_TLS_TPOFF = 56, /* Negated offset in static TLS block. */
R_390_20 = 57, /* Direct 20 bit. */
R_390_GOT20 = 58, /* 20 bit GOT offset. */
R_390_GOTPLT20 = 59, /* 20 bit offset to jump slot. */
R_390_TLS_GOTIE20 = 60, /* 20 bit GOT offset for static TLS block offset. */
/* Keep this the last entry. */
R_390_NUM = 61,
};
/* CRIS relocations. */
enum {
R_CRIS_NONE = 0,
R_CRIS_8 = 1,
R_CRIS_16 = 2,
R_CRIS_32 = 3,
R_CRIS_8_PCREL = 4,
R_CRIS_16_PCREL = 5,
R_CRIS_32_PCREL = 6,
R_CRIS_GNU_VTINHERIT = 7,
R_CRIS_GNU_VTENTRY = 8,
R_CRIS_COPY = 9,
R_CRIS_GLOB_DAT = 10,
R_CRIS_JUMP_SLOT = 11,
R_CRIS_RELATIVE = 12,
R_CRIS_16_GOT = 13,
R_CRIS_32_GOT = 14,
R_CRIS_16_GOTPLT = 15,
R_CRIS_32_GOTPLT = 16,
R_CRIS_32_GOTREL = 17,
R_CRIS_32_PLT_GOTREL = 18,
R_CRIS_32_PLT_PCREL = 19,
R_CRIS_NUM = 20,
};
/* AMD x86-64 relocations. */
enum {
R_X86_64_NONE = 0, /* No reloc */
R_X86_64_64 = 1, /* Direct 64 bit */
R_X86_64_PC32 = 2, /* PC relative 32 bit signed */
R_X86_64_GOT32 = 3, /* 32 bit GOT entry */
R_X86_64_PLT32 = 4, /* 32 bit PLT address */
R_X86_64_COPY = 5, /* Copy symbol at runtime */
R_X86_64_GLOB_DAT = 6, /* Create GOT entry */
R_X86_64_JUMP_SLOT = 7, /* Create PLT entry */
R_X86_64_RELATIVE = 8, /* Adjust by program base */
R_X86_64_GOTPCREL = 9, /* 32 bit signed PC relative offset to GOT */
R_X86_64_32 = 10, /* Direct 32 bit zero extended */
R_X86_64_32S = 11, /* Direct 32 bit sign extended */
R_X86_64_16 = 12, /* Direct 16 bit zero extended */
R_X86_64_PC16 = 13, /* 16 bit sign extended pc relative */
R_X86_64_8 = 14, /* Direct 8 bit sign extended */
R_X86_64_PC8 = 15, /* 8 bit sign extended pc relative */
R_X86_64_DTPMOD64 = 16, /* ID of module containing symbol */
R_X86_64_DTPOFF64 = 17, /* Offset in module's TLS block */
R_X86_64_TPOFF64 = 18, /* Offset in initial TLS block */
R_X86_64_TLSGD = 19, /* 32 bit signed PC relative offset to two GOT entries for GD symbol */
R_X86_64_TLSLD = 20, /* 32 bit signed PC relative offset to two GOT entries for LD symbol */
R_X86_64_DTPOFF32 = 21, /* Offset in TLS block */
R_X86_64_GOTTPOFF = 22, /* 32 bit signed PC relative offset GOT entry for IE symbol */
R_X86_64_TPOFF32 = 23, /* Offset in initial TLS block */
R_X86_64_PC64 = 24, /* PC relative 64 bit */
R_X86_64_GOTOFF64 = 25, /* 64 bit offset to GOT */
R_X86_64_GOTPC32 = 26, /* 32 bit signed pc relative offset to GOT */
R_X86_64_GOT64 = 27, /* 64-bit GOT entry offset */
R_X86_64_GOTPCREL64 = 28, /* 64-bit PC relative offset to GOT entry */
R_X86_64_GOTPC64 = 29, /* 64-bit PC relative offset to GOT */
R_X86_64_GOTPLT64 = 30, /* like GOT64, says PLT entry needed */
R_X86_64_PLTOFF64 = 31, /* 64-bit GOT relative offset to PLT entry */
R_X86_64_SIZE32 = 32, /* Size of symbol plus 32-bit addend */
R_X86_64_SIZE64 = 33, /* Size of symbol plus 64-bit addend */
R_X86_64_GOTPC32_TLSDESC = 34, /* GOT offset for TLS descriptor. */
R_X86_64_TLSDESC_CALL = 35, /* Marker for call through TLS descriptor. */
R_X86_64_TLSDESC = 36, /* TLS descriptor. */
R_X86_64_IRELATIVE = 37, /* Adjust indirectly by program base */
R_X86_64_NUM = 38,
};
/* AM33 relocations. */
enum {
R_MN10300_NONE = 0, /* No reloc. */
R_MN10300_32 = 1, /* Direct 32 bit. */
R_MN10300_16 = 2, /* Direct 16 bit. */
R_MN10300_8 = 3, /* Direct 8 bit. */
R_MN10300_PCREL32 = 4, /* PC-relative 32-bit. */
R_MN10300_PCREL16 = 5, /* PC-relative 16-bit signed. */
R_MN10300_PCREL8 = 6, /* PC-relative 8-bit signed. */
R_MN10300_GNU_VTINHERIT = 7, /* Ancient C++ vtable garbage... */
R_MN10300_GNU_VTENTRY = 8, /* ... collection annotation. */
R_MN10300_24 = 9, /* Direct 24 bit. */
R_MN10300_GOTPC32 = 10, /* 32-bit PCrel offset to GOT. */
R_MN10300_GOTPC16 = 11, /* 16-bit PCrel offset to GOT. */
R_MN10300_GOTOFF32 = 12, /* 32-bit offset from GOT. */
R_MN10300_GOTOFF24 = 13, /* 24-bit offset from GOT. */
R_MN10300_GOTOFF16 = 14, /* 16-bit offset from GOT. */
R_MN10300_PLT32 = 15, /* 32-bit PCrel to PLT entry. */
R_MN10300_PLT16 = 16, /* 16-bit PCrel to PLT entry. */
R_MN10300_GOT32 = 17, /* 32-bit offset to GOT entry. */
R_MN10300_GOT24 = 18, /* 24-bit offset to GOT entry. */
R_MN10300_GOT16 = 19, /* 16-bit offset to GOT entry. */
R_MN10300_COPY = 20, /* Copy symbol at runtime. */
R_MN10300_GLOB_DAT = 21, /* Create GOT entry. */
R_MN10300_JMP_SLOT = 22, /* Create PLT entry. */
R_MN10300_RELATIVE = 23, /* Adjust by program base. */
R_MN10300_NUM = 24,
};
/* M32R relocs. */
enum {
R_M32R_NONE = 0, /* No reloc. */
R_M32R_16 = 1, /* Direct 16 bit. */
R_M32R_32 = 2, /* Direct 32 bit. */
R_M32R_24 = 3, /* Direct 24 bit. */
R_M32R_10_PCREL = 4, /* PC relative 10 bit shifted. */
R_M32R_18_PCREL = 5, /* PC relative 18 bit shifted. */
R_M32R_26_PCREL = 6, /* PC relative 26 bit shifted. */
R_M32R_HI16_ULO = 7, /* High 16 bit with unsigned low. */
R_M32R_HI16_SLO = 8, /* High 16 bit with signed low. */
R_M32R_LO16 = 9, /* Low 16 bit. */
R_M32R_SDA16 = 10, /* 16 bit offset in SDA. */
R_M32R_GNU_VTINHERIT = 11,
R_M32R_GNU_VTENTRY = 12,
};
/* M32R relocs use SHT_RELA. */
enum {
R_M32R_16_RELA = 33, /* Direct 16 bit. */
R_M32R_32_RELA = 34, /* Direct 32 bit. */
R_M32R_24_RELA = 35, /* Direct 24 bit. */
R_M32R_10_PCREL_RELA = 36, /* PC relative 10 bit shifted. */
R_M32R_18_PCREL_RELA = 37, /* PC relative 18 bit shifted. */
R_M32R_26_PCREL_RELA = 38, /* PC relative 26 bit shifted. */
R_M32R_HI16_ULO_RELA = 39, /* High 16 bit with unsigned low */
R_M32R_HI16_SLO_RELA = 40, /* High 16 bit with signed low */
R_M32R_LO16_RELA = 41, /* Low 16 bit */
R_M32R_SDA16_RELA = 42, /* 16 bit offset in SDA */
R_M32R_RELA_GNU_VTINHERIT = 43,
R_M32R_RELA_GNU_VTENTRY = 44,
R_M32R_REL32 = 45, /* PC relative 32 bit. */
R_M32R_GOT24 = 48, /* 24 bit GOT entry */
R_M32R_26_PLTREL = 49, /* 26 bit PC relative to PLT shifted */
R_M32R_COPY = 50, /* Copy symbol at runtime */
R_M32R_GLOB_DAT = 51, /* Create GOT entry */
R_M32R_JMP_SLOT = 52, /* Create PLT entry */
R_M32R_RELATIVE = 53, /* Adjust by program base */
R_M32R_GOTOFF = 54, /* 24 bit offset to GOT */
R_M32R_GOTPC24 = 55, /* 24 bit PC relative offset to GOT */
R_M32R_GOT16_HI_ULO = 56, /* High 16 bit GOT entry with unsigned low */
R_M32R_GOT16_HI_SLO = 57, /* High 16 bit GOT entry with signed low */
R_M32R_GOT16_LO = 58, /* Low 16 bit GOT entry */
R_M32R_GOTPC_HI_ULO = 59, /* High 16 bit PC relative offset to GOT with unsigned low */
R_M32R_GOTPC_HI_SLO = 60, /* High 16 bit PC relative offset to GOT with signed low */
R_M32R_GOTPC_LO = 61, /* Low 16 bit PC relative offset to GOT */
R_M32R_GOTOFF_HI_ULO = 62, /* High 16 bit offset to GOT with unsigned low */
R_M32R_GOTOFF_HI_SLO = 63, /* High 16 bit offset to GOT with signed low */
R_M32R_GOTOFF_LO = 64, /* Low 16 bit offset to GOT */
R_M32R_NUM = 256, /* Keep this the last entry. */
};
#endif
edb-debugger/.editorconfig 0000644 0001750 0001750 00000000576 13765535463 015416 0 ustar eteran eteran # EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
# Matches multiple files with brace expansion notation
# Set default charset
[*.{c,h,cpp,hpp,tcc}]
charset = utf-8
indent_style = tab
indent_size = 4
trim_trailing_whitespace = true
edb-debugger/CMakeLists.txt 0000644 0001750 0001750 00000012124 13765535463 015471 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
project (edb CXX)
enable_testing()
if(NOT EXISTS "${PROJECT_SOURCE_DIR}/src/qhexview/.git")
message(SEND_ERROR "The git submodules are not available. Please run:\ngit submodule update --init --recursive")
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/Modules/")
include("GNUInstallDirs")
include("CheckIncludeFileCXX")
include("DetectCompiler")
include("DetectOS")
include("DetectArchitecture")
include("EnableSanitizers")
include("EnableSTLDebug")
include("ProjectDefaults")
if(TARGET_COMPILER_GCC AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 5.0)
message(FATAL_ERROR "Your g++ version is too old. At least 5.0 is required.")
endif()
find_package(Boost 1.35 REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
find_package(Capstone REQUIRED)
include_directories(${CAPSTONE_INCLUDE_DIRS})
link_directories(${CAPSTONE_LIBRARY_DIRS})
# eventually use this to generate version.h?
set(TARGET_VERSION_MAJOR 1)
set(TARGET_VERSION_MINOR 3)
set(TARGET_VERSION_PATCH 0)
set_property(GLOBAL PROPERTY VERSION ${TARGET_VERSION_MAJOR}.${TARGET_VERSION_MINOR}.${TARGET_VERSION_PATCH})
if (UNIX)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GRAPHVIZ libgvc>=2.38.0)
if(GRAPHVIZ_FOUND)
include_directories(${GRAPHVIZ_INCLUDE_DIRS})
link_directories(${GRAPHVIZ_LIBRARY_DIRS})
add_definitions(-DENABLE_GRAPH)
endif()
endif()
message(STATUS "Checking for module 'double-conversion'")
# Using check_include_file_cxx instead of find_package etc. to support various versions of double-conversion. Some versions don't have CMake modules, some have a bit incompatible ones...
check_include_file_cxx("double-conversion/double-conversion.h" HAVE_DOUBLE_CONVERSION)
if(NOT HAVE_DOUBLE_CONVERSION)
UNSET(HAVE_DOUBLE_CONVERSION CACHE)
message(WARNING "libdouble-conversion header wasn't found. 32- and 64-bit floating-point values will be shown with max_digits10 digits of precision instead of shortest representation.")
else()
find_library(DOUBLE_CONVERSION_LIBRARIES double-conversion)
if(NOT DOUBLE_CONVERSION_LIBRARIES)
message(WARNING "libdouble-conversion library wasn't found. 32- and 64-bit floating-point values will be shown with max_digits10 digits of precision instead of shortest representation.")
else()
add_definitions("-DHAVE_DOUBLE_CONVERSION")
endif()
endif()
find_package(Qt5Core)
include_directories("include")
if(TARGET_PLATFORM_LINUX)
include_directories("include/os/unix")
include_directories("include/os/unix/linux")
elseif(TARGET_PLATFORM_WINDOWS)
include_directories("include/os/win32")
endif()
if(TARGET_ARCH_X86 OR TARGET_ARCH_ARM32)
add_definitions(-DEDB_IS_32_BIT=true -DEDB_IS_64_BIT=false)
elseif(TARGET_ARCH_X64 OR TARGET_ARCH_ARM64)
add_definitions(-DEDB_IS_32_BIT=false -DEDB_IS_64_BIT=true)
else()
message(SEND_ERROR "Unexpected bitness: \"sizeof(void*)=${CMAKE_SIZEOF_VOID_P}.\"")
endif()
if(TARGET_ARCH_X86)
add_definitions(-DEDB_X86)
include_directories("include/arch/x86-generic")
elseif(TARGET_ARCH_X64)
add_definitions(-DEDB_X86_64)
include_directories("include/arch/x86-generic")
elseif(TARGET_ARCH_ARM32)
add_definitions(-DEDB_ARM32)
include_directories("include/arch/arm-generic")
elseif(TARGET_ARCH_ARM64)
add_definitions(-DEDB_ARM64)
include_directories("include/arch/arm-generic")
endif()
# FIXME: This is also useful on Windows, so it should be made usable there too.
if(UNIX)
if(TARGET_ARCH_FAMILY_X86)
pkg_check_modules(GDTOA gdtoa-desktop)
if(NOT GDTOA_FOUND)
message(WARNING "gdtoa-desktop package wasn't found. 80-bit floating-point values will be shown with max_digits10 digits of precision instead of shortest representation.")
else()
add_definitions("-DHAVE_GDTOA")
include_directories(${GDTOA_INCLUDE_DIRS})
link_directories(${GDTOA_LIBRARY_DIRS})
endif()
endif()
endif()
if (TARGET_COMPILER_CLANG OR TARGET_COMPILER_GCC)
add_compile_options(
-W
-Wall
#-Wshadow
-Wnon-virtual-dtor
#-Wold-style-cast
-Wcast-align
-Wunused
-Woverloaded-virtual
-pedantic
#-Wconversion
#-Wsign-conversion
#-Wnull-dereference
-Wdouble-promotion
-Wformat=2
-Wno-unused-macros
-Wno-switch-enum
-Wno-unknown-pragmas
)
if(TARGET_COMPILER_CLANG)
add_compile_options(
#-Wshorten-64-to-32
-Wconditional-uninitialized
#-Wshadow-uncaptured-local
-Wmissing-prototypes
#-Wexit-time-destructors
#-Wglobal-constructors
-Wimplicit-fallthrough
)
elseif(TARGET_COMPILER_GCC)
add_compile_options(
#-Wuseless-cast
#-Wduplicated-cond
#-Wduplicated-branches
-Wlogical-op
#-Wsuggest-attribute=pure
#-Wsuggest-attribute=const
#-Wsuggest-attribute=noreturn
#-Wsuggest-final-types
#-Wsuggest-final-methods
-Wsuggest-override
)
endif()
endif()
add_subdirectory(src)
add_subdirectory(plugins)
add_subdirectory(libELF)
add_subdirectory(libPE)
install (FILES ${CMAKE_SOURCE_DIR}/edb.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
install (FILES ${CMAKE_SOURCE_DIR}/edb.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications/)
install (FILES ${CMAKE_SOURCE_DIR}/src/images/edb.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps/)
edb-debugger/edb.desktop 0000644 0001750 0001750 00000000303 13765535463 015052 0 ustar eteran eteran [Desktop Entry]
Name=edb
GenericName="Evan's Debugger"
Comment="edb is a cross platform x86/x86-64 debugger"
Exec=edb
Icon=edb
Terminal=false
Type=Application
Categories=Development;Qt;Debugger;
edb-debugger/cmake/ 0000755 0001750 0001750 00000000000 13765535463 014011 5 ustar eteran eteran edb-debugger/cmake/Modules/ 0000755 0001750 0001750 00000000000 13765535463 015421 5 ustar eteran eteran edb-debugger/cmake/Modules/DetectArchitecture.cmake 0000644 0001750 0001750 00000001355 13765535463 022202 0 ustar eteran eteran
if((CMAKE_SYSTEM_PROCESSOR MATCHES "i[3456]86") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "[aA][mM][dD]64"))
set(TARGET_ARCH_FAMILY_X86 1)
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
set(TARGET_ARCH_X64 1)
set(TARGET_ARCH_NAME "x86-64")
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
set(TARGET_ARCH_X86 1)
set(TARGET_ARCH_NAME "x86")
endif()
elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "armv[0-9]+"))
set(TARGET_ARCH_FAMILY_ARM 1)
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
set(TARGET_ARCH_ARM64 1)
set(TARGET_ARCH_NAME "arm64")
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
set(TARGET_ARCH_ARM32 1)
set(TARGET_ARCH_NAME "arm32")
endif()
else()
message(FATAL_ERROR "Unsupported Architecture: ${CMAKE_SYSTEM_PROCESSOR}")
endif()
edb-debugger/cmake/Modules/EnableSTLDebug.cmake 0000644 0001750 0001750 00000000460 13765535463 021143 0 ustar eteran eteran
include("DetectCompiler")
if((TARGET_COMPILER_GCC) OR (TARGET_COMPILER_CLANG))
option(ENABLE_STL_DEBUG "Enable STL container debugging")
if(ENABLE_STL_DEBUG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_DEBUG")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GLIBCXX_DEBUG")
endif()
endif()
edb-debugger/cmake/Modules/EnableSanitizers.cmake 0000644 0001750 0001750 00000002161 13765535463 021665 0 ustar eteran eteran
include("DetectCompiler")
function(JOIN VALUES GLUE OUTPUT)
string (REPLACE ";" "${GLUE}" _TMP_STR "${VALUES}")
set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
endfunction()
if((TARGET_COMPILER_GCC) OR (TARGET_COMPILER_CLANG))
option(ENABLE_ASAN "Enable address sanitizer")
option(ENABLE_MSAN "Enable memory sanitizer")
option(ENABLE_USAN "Enable undefined sanitizer")
option(ENABLE_TSAN "Enable thread sanitizer")
set(SANITIZERS "")
if(ENABLE_ASAN)
list(APPEND SANITIZERS "address")
endif()
if(ENABLE_MSAN)
list(APPEND SANITIZERS "memory")
endif()
if(ENABLE_USAN)
list(APPEND SANITIZERS "undefined")
endif()
if(ENABLE_TSAN)
list(APPEND SANITIZERS "thread")
endif()
JOIN("${SANITIZERS}" "," LIST_OF_SANITIZERS)
endif()
if(LIST_OF_SANITIZERS)
if(NOT "${LIST_OF_SANITIZERS}" STREQUAL "")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${LIST_OF_SANITIZERS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${LIST_OF_SANITIZERS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${LIST_OF_SANITIZERS}")
endif()
endif()
edb-debugger/cmake/Modules/ProjectDefaults.cmake 0000644 0001750 0001750 00000000735 13765535463 021526 0 ustar eteran eteran
include("DetectCompiler")
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build." FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
endif()
# Generate compile_commands.json to make it easier to work with clang based tools
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(TARGET_COMPILER_MSVC)
add_definitions(-DUNICODE -D_UNICODE -D_CRT_SECURE_NO_WARNINGS)
endif()
edb-debugger/cmake/Modules/DetectCompiler.cmake 0000644 0001750 0001750 00000000464 13765535463 021332 0 ustar eteran eteran
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set(TARGET_COMPILER_MSVC 1)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(TARGET_COMPILER_CLANG 1)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set(TARGET_COMPILER_GCC 1)
else()
message(FATAL_ERROR "Unsupported Compiler: ${CMAKE_CXX_COMPILER_ID}")
endif()
edb-debugger/cmake/Modules/FindCapstone.cmake 0000644 0001750 0001750 00000001746 13765535463 021010 0 ustar eteran eteran if (UNIX)
find_package(PkgConfig REQUIRED)
pkg_check_modules(CAPSTONE REQUIRED capstone>=3.0.4)
elseif (WIN32)
# CAPSTONE_SDK should be the path to a directory containing a subdirectory "include/capstone"
# with all the include headers of capstone and another subdirectory "lib" with "capstone_dll.lib" or "libcapstone.dll".
if (NOT DEFINED CAPSTONE_SDK)
set(CAPSTONE_SDK NOTFOUND CACHE PATH "Path to the Capstone SDK")
message(SEND_ERROR "Path to Capstone SDK is missing. Please specify CAPSTONE_SDK.")
endif()
find_path(CAPSTONE_INCLUDE_DIRS
capstone/capstone.h
PATHS ${CAPSTONE_SDK}/include
)
if (NOT CAPSTONE_INCLUDE_DIRS)
message(SEND_ERROR "Include directory for Capstone not found. Please specify CAPSTONE_SDK.")
endif()
find_library(CAPSTONE_LIBRARIES
NAMES capstone_dll libcapstone
HINTS "${CAPSTONE_SDK}/lib"
)
if (NOT CAPSTONE_LIBRARIES)
message(SEND_ERROR "Library directory for Capstone not found. Please specify CAPSTONE_SDK.")
endif()
endif()
edb-debugger/cmake/Modules/DetectOS.cmake 0000644 0001750 0001750 00000000571 13765535463 020100 0 ustar eteran eteran
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
set(TARGET_PLATFORM_WINDOWS 1)
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux")
set(TARGET_PLATFORM_LINUX 1)
elseif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
set(TARGET_PLATFORM_FREEBSD 1)
elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(TARGET_PLATFORM_MACOS 1)
else()
message(FATAL_ERROR "Unsupported OS: ${CMAKE_SYSTEM_NAME}")
endif ()
edb-debugger/cmake/Modules/DetectGitBranch.cmake 0000644 0001750 0001750 00000000525 13765535463 021417 0 ustar eteran eteran
function(git_get_branch RESULT)
if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
execute_process(
COMMAND git rev-parse HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(${RESULT} ${OUTPUT} PARENT_SCOPE)
else()
set(${RESULT} "Unknown" PARENT_SCOPE)
endif()
endfunction()
edb-debugger/pkg/ 0000755 0001750 0001750 00000000000 13765535463 013512 5 ustar eteran eteran edb-debugger/pkg/deb/ 0000755 0001750 0001750 00000000000 13765535463 014244 5 ustar eteran eteran edb-debugger/pkg/deb/create-deb-qt5.sh 0000755 0001750 0001750 00000003400 13765535463 017302 0 ustar eteran eteran #!/bin/bash
SOURCE_DIR=$PWD/../../
TEMP_DIR=$(mktemp -d)
BUILD_DIR=$TEMP_DIR/build
DEB_DIR=$BUILD_DIR/deb
trap "rm -rf $TEMP_DIR" EXIT
# Build edb
mkdir -p $BUILD_DIR
pushd $BUILD_DIR
cmake $SOURCE_DIR
if ! make -j8; then
echo "Compiling error. Exiting..."
exit 1
fi
# Install it into a temp directory
make DESTDIR=$DEB_DIR install
# Getting Arch
if [ $(uname -m) == "x86_64" ]; then
ARCH="amd64"
else
ARCH="i386"
fi
INSTALL_SIZE=$(du -b -s $DEB_DIR | cut -f1)
VERSION=$($BUILD_DIR/edb --dump-version 2> /dev/null)
#TODO(eteran): figure out the proper deps for Qt5 on Ubuntu/Debian
DEPENDS="libqt5core5a (>= 5.0.0), libqt5gui5 (>= 5.0.0), libcapstone3"
# Create the meta-data dir
mkdir -p $DEB_DIR/DEBIAN
# MD5s
# TODO(eteran): do we need to get rid of the prefix on the files here?
find $DEB_DIR -type f | xargs md5sum > $DEB_DIR/DEBIAN/md5sums
# Generating Debian control file
echo "Package: edb-debugger-qt5
Version: $VERSION
Architecture: $ARCH
Maintainer: Evan Teran
Homepage: http://www.codef00.com
Installed-Size: $INSTALL_SIZE
Depends: $DEPENDS
Provides: edb
Section: devel
Priority: extra
Description: Graphical debugger and disassembler for ELF binaries
EDB (Evan's Debugger) is a modular and modern disassembler and debugger for
binary ELF files based on ptrace API and the capstone disassembly library.
EDB is very similar to OllyDbg, a famous freeware debugger for PE
(Portable Executable) files. The intent of EDB is to debug binaries without
source code. It's possible to set conditional and inconditional breakpoints,
display memory stack, processor registers state and more. The power of EDB can
be increased with many plugins." > $DEB_DIR/DEBIAN/control
# Generate package
dpkg-deb -b $DEB_DIR $SOURCE_DIR/edb-debugger-qt5_${VERSION}_${ARCH}.deb
edb-debugger/plugins/ 0000755 0001750 0001750 00000000000 13765535463 014412 5 ustar eteran eteran edb-debugger/plugins/ProcessProperties/ 0000755 0001750 0001750 00000000000 13765535463 020105 5 ustar eteran eteran edb-debugger/plugins/ProcessProperties/DialogResults.cpp 0000644 0001750 0001750 00000002610 13765535463 023371 0 ustar eteran eteran
#include "DialogResults.h"
#include "edb.h"
#include
namespace ProcessPropertiesPlugin {
/**
* @brief DialogResults::DialogResults
* @param parent
* @param f
*/
DialogResults::DialogResults(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
ui.tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
model_ = new ResultsModel(this);
filterModel_ = new QSortFilterProxyModel(this);
filterModel_->setFilterKeyColumn(2);
filterModel_->setSourceModel(model_);
ui.tableView->setModel(filterModel_);
connect(ui.textFilter, &QLineEdit::textChanged, filterModel_, &QSortFilterProxyModel::setFilterFixedString);
}
/**
* @brief DialogResults::addResult
* @param result
*/
void DialogResults::addResult(const ResultsModel::Result &result) {
model_->addResult(result);
}
/**
* @brief DialogResults::on_tableView_doubleClicked
* @param index
*/
void DialogResults::on_tableView_doubleClicked(const QModelIndex &index) {
if (index.isValid()) {
const QModelIndex realIndex = filterModel_->mapToSource(index);
if (realIndex.isValid()) {
if (auto item = static_cast(realIndex.internalPointer())) {
edb::v1::dump_data(item->address, false);
}
}
}
}
/**
* @brief DialogResults::resultCount
* @return
*/
int DialogResults::resultCount() const {
return model_->rowCount();
}
}
edb-debugger/plugins/ProcessProperties/DialogProcessProperties.h 0000644 0001750 0001750 00000003547 13765535463 025102 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_PROCESS_PROPERTIES_H_20120817_
#define DIALOG_PROCESS_PROPERTIES_H_20120817_
#include "ThreadsModel.h"
#include "ui_DialogProcessProperties.h"
#include
#include
namespace ProcessPropertiesPlugin {
class DialogProcessProperties : public QDialog {
Q_OBJECT
public:
explicit DialogProcessProperties(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogProcessProperties() override = default;
public Q_SLOTS:
void on_btnParent_clicked();
void on_btnImage_clicked();
void on_btnRefreshEnvironment_clicked();
void on_btnRefreshHandles_clicked();
void on_btnStrings_clicked();
void on_btnRefreshThreads_clicked();
void on_btnRefreshMemory_clicked();
void on_txtSearchEnvironment_textChanged(const QString &text);
private:
void updateGeneralPage();
void updateMemoryPage();
void updateModulePage();
void updateHandles();
void updateThreads();
void updateEnvironmentPage(const QString &filter);
private:
void showEvent(QShowEvent *event) override;
private:
Ui::DialogProcessProperties ui;
ThreadsModel *threadsModel_ = nullptr;
QSortFilterProxyModel *threadsFilter_ = nullptr;
};
}
#endif
edb-debugger/plugins/ProcessProperties/ProcessProperties.cpp 0000644 0001750 0001750 00000003313 13765535463 024304 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "ProcessProperties.h"
#include "DialogProcessProperties.h"
#include "edb.h"
#include
namespace ProcessPropertiesPlugin {
/**
* @brief ProcessProperties::ProcessProperties
* @param parent
*/
ProcessProperties::ProcessProperties(QObject *parent)
: QObject(parent) {
dialog_ = new DialogProcessProperties(edb::v1::debugger_ui);
}
/**
* @brief ProcessProperties::~ProcessProperties
*/
ProcessProperties::~ProcessProperties() {
#if 0
delete dialog_;
#endif
}
/**
* @brief ProcessProperties::menu
* @param parent
* @return
*/
QMenu *ProcessProperties::menu(QWidget *parent) {
Q_ASSERT(parent);
if (!menu_) {
menu_ = new QMenu(tr("Process Properties"), parent);
menu_->addAction(tr("&Process Properties"), this, SLOT(showMenu()), QKeySequence(tr("Ctrl+P")));
menu_->addAction(tr("Process &Strings"), dialog_, SLOT(on_btnStrings_clicked()), QKeySequence(tr("Ctrl+S")));
}
return menu_;
}
/**
* @brief ProcessProperties::showMenu
*/
void ProcessProperties::showMenu() {
dialog_->show();
}
}
edb-debugger/plugins/ProcessProperties/ResultsModel.cpp 0000644 0001750 0001750 00000010455 13765535463 023240 0 ustar eteran eteran /*
Copyright (C) 2006 - 2019 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "ResultsModel.h"
#include "edb.h"
#include
namespace ProcessPropertiesPlugin {
/**
* @brief ResultsModel::ResultsModel
* @param parent
*/
ResultsModel::ResultsModel(QObject *parent)
: QAbstractItemModel(parent) {
}
/**
* @brief ResultsModel::headerData
* @param section
* @param orientation
* @param role
* @return
*/
QVariant ResultsModel::headerData(int section, Qt::Orientation orientation, int role) const {
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return tr("Address");
case 1:
return tr("Type");
case 2:
return tr("String");
}
}
return QVariant();
}
/**
* @brief ResultsModel::data
* @param index
* @param role
* @return
*/
QVariant ResultsModel::data(const QModelIndex &index, int role) const {
if (!index.isValid()) {
return QVariant();
}
const Result &result = results_[index.row()];
if (role == Qt::DisplayRole) {
switch (index.column()) {
case 0:
return edb::v1::format_pointer(result.address);
case 1:
switch (result.type) {
case Result::Ascii:
return tr("ASCII");
case Result::Utf8:
return tr("UTF8");
case Result::Utf16:
return tr("UTF16");
case Result::Utf32:
return tr("UTF32");
}
break;
case 2:
return result.string;
default:
return QVariant();
}
}
return QVariant();
}
/**
* @brief ResultsModel::addResult
* @param r
*/
void ResultsModel::addResult(const Result &r) {
beginInsertRows(QModelIndex(), rowCount(), rowCount());
results_.push_back(r);
endInsertRows();
}
/**
* @brief ResultsModel::index
* @param row
* @param column
* @param parent
* @return
*/
QModelIndex ResultsModel::index(int row, int column, const QModelIndex &parent) const {
Q_UNUSED(parent)
if (row >= results_.size()) {
return QModelIndex();
}
if (column >= 3) {
return QModelIndex();
}
if (row >= 0) {
return createIndex(row, column, const_cast(&results_[row]));
} else {
return createIndex(row, column);
}
}
/**
* @brief ResultsModel::parent
* @param index
* @return
*/
QModelIndex ResultsModel::parent(const QModelIndex &index) const {
Q_UNUSED(index)
return QModelIndex();
}
/**
* @brief ResultsModel::rowCount
* @param parent
* @return
*/
int ResultsModel::rowCount(const QModelIndex &parent) const {
Q_UNUSED(parent)
return results_.size();
}
/**
* @brief ResultsModel::columnCount
* @param parent
* @return
*/
int ResultsModel::columnCount(const QModelIndex &parent) const {
Q_UNUSED(parent)
return 3;
}
/**
* @brief ResultsModel::sort
* @param column
* @param order
*/
void ResultsModel::sort(int column, Qt::SortOrder order) {
if (order == Qt::AscendingOrder) {
switch (column) {
case 0:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.address < s2.address; });
break;
case 1:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.type < s2.type; });
break;
case 2:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.string < s2.string; });
break;
}
} else {
switch (column) {
case 0:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.address > s2.address; });
break;
case 1:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.type > s2.type; });
break;
case 2:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.string < s2.string; });
break;
}
}
Q_EMIT dataChanged(createIndex(0, 0, nullptr), createIndex(-1, -1, nullptr));
}
}
edb-debugger/plugins/ProcessProperties/DialogStrings.ui 0000644 0001750 0001750 00000006213 13765535463 023217 0 ustar eteran eteran
Evan Teran
ProcessPropertiesPlugin::DialogStrings
0
0
702
384
String Search
-
Regions To Search:
-
Filter
true
-
Monospace
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
-
Include UTF-16 Results
-
QDialogButtonBox::Close
-
0
Qt::Horizontal
buttonBox
accepted()
ProcessPropertiesPlugin::DialogStrings
accept()
644
326
671
282
buttonBox
rejected()
ProcessPropertiesPlugin::DialogStrings
reject()
532
331
516
283
edb-debugger/plugins/ProcessProperties/ResultsModel.h 0000644 0001750 0001750 00000003564 13765535463 022710 0 ustar eteran eteran /*
Copyright (C) 2006 - 2019 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef PROCESS_PROPERTIES_RESULTS_MODEL_H_20191119_
#define PROCESS_PROPERTIES_RESULTS_MODEL_H_20191119_
#include "Function.h"
#include "Types.h"
#include
#include
namespace ProcessPropertiesPlugin {
class ResultsModel : public QAbstractItemModel {
Q_OBJECT
public:
struct Result {
edb::address_t address = 0;
QString string;
enum {
Ascii,
Utf8,
Utf16,
Utf32,
} type;
};
public:
explicit ResultsModel(QObject *parent = nullptr);
public:
QVariant data(const QModelIndex &index, int role) const override;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &index) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
public:
void addResult(const Result &r);
public:
const QVector &results() const { return results_; }
private:
QVector results_;
};
}
#endif
edb-debugger/plugins/ProcessProperties/CMakeLists.txt 0000644 0001750 0001750 00000002102 13765535463 022640 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
include("GNUInstallDirs")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(PluginName "ProcessProperties")
find_package(Qt5 5.0.0 REQUIRED Widgets Network)
add_library(${PluginName} SHARED
DialogProcessProperties.cpp
DialogProcessProperties.h
DialogProcessProperties.ui
DialogStrings.cpp
DialogStrings.h
DialogStrings.ui
ProcessProperties.cpp
ProcessProperties.h
DialogResults.cpp
DialogResults.h
DialogResults.ui
ResultsModel.cpp
ResultsModel.h
)
target_link_libraries(${PluginName} Qt5::Widgets Qt5::Network edb)
install (TARGETS ${PluginName} DESTINATION ${CMAKE_INSTALL_LIBDIR}/edb)
set_property(TARGET ${PluginName} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD 14)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${PluginName} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set_property(TARGET ${PluginName} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
edb-debugger/plugins/ProcessProperties/DialogProcessProperties.cpp 0000644 0001750 0001750 00000037300 13765535463 025427 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "DialogProcessProperties.h"
#include "Configuration.h"
#include "DialogStrings.h"
#include "IDebugger.h"
#include "IProcess.h"
#include "IRegion.h"
#include "ISymbolManager.h"
#include "MemoryRegions.h"
#include "Module.h"
#include "QtHelper.h"
#include "Symbol.h"
#include "edb.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
#include
#include
#endif
namespace ProcessPropertiesPlugin {
Q_DECLARE_NAMESPACE_TR(ProcessPropertiesPlugin)
namespace {
/**
* @brief arguments_to_string
* @param args
* @return
*/
QString arguments_to_string(const QList &args) {
QString ret;
for (const QByteArray &arg : args) {
ret.append(' ');
ret.append(QString::fromUtf8(arg));
}
ret.remove(0, 1);
return ret;
}
/**
* @brief size_to_string
* @param n
* @return
*/
QString size_to_string(size_t n) {
static constexpr size_t KiB = 1024;
static constexpr size_t MiB = KiB * 1024;
static constexpr size_t GiB = MiB * 1024;
if (n < KiB) {
return QString::number(n);
} else if (n < MiB) {
return QString::number(n / KiB) + tr(" KiB");
} else if (n < GiB) {
return QString::number(n / MiB) + tr(" MiB");
} else {
return QString::number(n / GiB) + tr(" GiB");
}
}
#if defined(Q_OS_LINUX)
/**
* @brief file_type
* @param filename
* @return
*/
QString file_type(const QString &filename) {
const QFileInfo info(filename);
const QString basename(info.completeBaseName());
if (basename.startsWith("socket:")) {
return tr("Socket");
}
if (basename.startsWith("pipe:")) {
return tr("Pipe");
}
return tr("File");
}
/**
* @brief tcp_socket_prcoessor
* @param symlink
* @param sock
* @param lst
* @return
*/
bool tcp_socket_prcoessor(QString *symlink, int sock, const QStringList &lst) {
Q_ASSERT(symlink);
if (lst.size() >= 13) {
bool ok;
const uint32_t local_address = ntohl(lst[1].toUInt(&ok, 16));
if (ok) {
const uint16_t local_port = lst[2].toUInt(&ok, 16);
if (ok) {
const uint32_t remote_address = ntohl(lst[3].toUInt(&ok, 16));
if (ok) {
const uint16_t remote_port = lst[4].toUInt(&ok, 16);
if (ok) {
const uint8_t state = lst[5].toUInt(&ok, 16);
Q_UNUSED(state)
if (ok) {
const int inode = lst[13].toUInt(&ok, 10);
if (ok) {
if (inode == sock) {
*symlink = QString("TCP: %1:%2 -> %3:%4")
.arg(QHostAddress(local_address).toString())
.arg(local_port)
.arg(QHostAddress(remote_address).toString())
.arg(remote_port);
return true;
}
}
}
}
}
}
}
}
return false;
}
/**
* @brief udp_socket_processor
* @param symlink
* @param sock
* @param lst
* @return
*/
bool udp_socket_processor(QString *symlink, int sock, const QStringList &lst) {
Q_ASSERT(symlink);
if (lst.size() >= 13) {
bool ok;
const uint32_t local_address = ntohl(lst[1].toUInt(&ok, 16));
if (ok) {
const uint16_t local_port = lst[2].toUInt(&ok, 16);
if (ok) {
const uint32_t remote_address = ntohl(lst[3].toUInt(&ok, 16));
if (ok) {
const uint16_t remote_port = lst[4].toUInt(&ok, 16);
if (ok) {
const uint8_t state = lst[5].toUInt(&ok, 16);
Q_UNUSED(state)
if (ok) {
const int inode = lst[13].toUInt(&ok, 10);
if (ok) {
if (inode == sock) {
*symlink = QString("UDP: %1:%2 -> %3:%4")
.arg(QHostAddress(local_address).toString())
.arg(local_port)
.arg(QHostAddress(remote_address).toString())
.arg(remote_port);
return true;
}
}
}
}
}
}
}
}
return false;
}
/**
* @brief unix_socket_processor
* @param symlink
* @param sock
* @param lst
* @return
*/
bool unix_socket_processor(QString *symlink, int sock, const QStringList &lst) {
Q_ASSERT(symlink);
if (lst.size() >= 6) {
bool ok;
// TODO(eteran): should this be toInt(...)?
const int inode = lst[6].toUInt(&ok, 10);
if (ok) {
if (inode == sock) {
*symlink = QString("UNIX [%1]").arg(lst[0]);
return true;
}
}
}
return false;
}
/**
* @brief process_socket_file
* @param filename
* @param symlink
* @param sock
* @param func
* @return
*/
template
QString process_socket_file(const QString &filename, QString *symlink, int sock, F func) {
Q_ASSERT(symlink);
QFile net(filename);
net.open(QIODevice::ReadOnly | QIODevice::Text);
if (net.isOpen()) {
QTextStream in(&net);
QString line;
// ditch first line, it is just table headings
in.readLine();
// read in the first line we care about
line = in.readLine();
// a null string means end of file (but not an empty string!)
while (!line.isNull()) {
QString lline(line);
const QStringList lst = lline.replace(":", " ").split(" ", QString::SkipEmptyParts);
if (func(symlink, sock, lst)) {
break;
}
line = in.readLine();
}
}
return *symlink;
}
/**
* @brief process_socket_tcp
* @param symlink
* @return
*/
QString process_socket_tcp(QString *symlink) {
Q_ASSERT(symlink);
const QString socket_info(symlink->mid(symlink->indexOf("socket:[")));
const int socket_number = socket_info.mid(8).remove("]").toUInt();
return process_socket_file("/proc/net/tcp", symlink, socket_number, tcp_socket_prcoessor);
}
/**
* @brief process_socket_unix
* @param symlink
* @return
*/
QString process_socket_unix(QString *symlink) {
Q_ASSERT(symlink);
const QString socket_info(symlink->mid(symlink->indexOf("socket:[")));
const int socket_number = socket_info.mid(8).remove("]").toUInt();
return process_socket_file("/proc/net/unix", symlink, socket_number, unix_socket_processor);
}
/**
* @brief process_socket_udp
* @param symlink
* @return
*/
QString process_socket_udp(QString *symlink) {
Q_ASSERT(symlink);
const QString socket_info(symlink->mid(symlink->indexOf("socket:[")));
const int socket_number = socket_info.mid(8).remove("]").toUInt();
return process_socket_file("/proc/net/udp", symlink, socket_number, udp_socket_processor);
}
#endif
}
/**
* @brief DialogProcessProperties::DialogProcessProperties
* @param parent
* @param f
*/
DialogProcessProperties::DialogProcessProperties(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
ui.tableModules->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui.tableMemory->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui.threadTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
threadsModel_ = new ThreadsModel(this);
threadsFilter_ = new QSortFilterProxyModel(this);
threadsFilter_->setSourceModel(threadsModel_);
threadsFilter_->setFilterCaseSensitivity(Qt::CaseInsensitive);
ui.threadTable->setModel(threadsFilter_);
}
/**
* @brief DialogProcessProperties::updateGeneralPage
*/
void DialogProcessProperties::updateGeneralPage() {
if (edb::v1::debugger_core) {
if (IProcess *process = edb::v1::debugger_core->process()) {
const QString exe = process->executable();
const QString cwd = process->currentWorkingDirectory();
std::shared_ptr parent = process->parent();
const edb::pid_t parent_pid = parent ? parent->pid() : 0;
const QString parent_exe = parent ? parent->executable() : QString();
const QList args = process->arguments();
ui.editImage->setText(exe);
// TODO(eteran): handle arguments with spaces
ui.editCommand->setText(arguments_to_string(args));
ui.editCurrentDirectory->setText(cwd);
ui.editStarted->setText(process->startTime().toString("yyyy-MM-dd hh:mm:ss.z"));
if (parent_pid) {
ui.editParent->setText(QString("%1 (%2)").arg(parent_exe).arg(parent_pid));
} else {
ui.editParent->setText(QString());
}
} else {
ui.editImage->setText(QString());
ui.editCommand->setText(QString());
ui.editCurrentDirectory->setText(QString());
ui.editStarted->setText(QString());
ui.editParent->setText(QString());
}
}
}
/**
* @brief DialogProcessProperties::updateModulePage
*/
void DialogProcessProperties::updateModulePage() {
ui.tableModules->clearContents();
ui.tableModules->setRowCount(0);
if (edb::v1::debugger_core) {
if (IProcess *process = edb::v1::debugger_core->process()) {
const QList modules = process->loadedModules();
ui.tableModules->setSortingEnabled(false);
for (const Module &m : modules) {
const int row = ui.tableModules->rowCount();
ui.tableModules->insertRow(row);
ui.tableModules->setItem(row, 0, new QTableWidgetItem(edb::v1::format_pointer(m.baseAddress)));
ui.tableModules->setItem(row, 1, new QTableWidgetItem(m.name));
}
ui.tableModules->setSortingEnabled(true);
}
}
}
/**
* @brief DialogProcessProperties::updateMemoryPage
*/
void DialogProcessProperties::updateMemoryPage() {
ui.tableMemory->clearContents();
ui.tableMemory->setRowCount(0);
if (edb::v1::debugger_core) {
edb::v1::memory_regions().sync();
const QList> regions = edb::v1::memory_regions().regions();
ui.tableMemory->setSortingEnabled(false);
for (const std::shared_ptr &r : regions) {
const int row = ui.tableMemory->rowCount();
ui.tableMemory->insertRow(row);
ui.tableMemory->setItem(row, 0, new QTableWidgetItem(edb::v1::format_pointer(r->start()))); // address
ui.tableMemory->setItem(row, 1, new QTableWidgetItem(size_to_string(r->size()))); // size
ui.tableMemory->setItem(row, 2, new QTableWidgetItem(QString("%1%2%3") // protection
.arg(r->readable() ? 'r' : '-')
.arg(r->writable() ? 'w' : '-')
.arg(r->executable() ? 'x' : '-')));
ui.tableMemory->setItem(row, 3, new QTableWidgetItem(r->name())); // name
}
ui.tableMemory->setSortingEnabled(true);
}
}
/**
* @brief DialogProcessProperties::on_txtSearchEnvironment_textChanged
* @param text
*/
void DialogProcessProperties::on_txtSearchEnvironment_textChanged(const QString &text) {
updateEnvironmentPage(text);
}
/**
* @brief DialogProcessProperties::updateEnvironmentPage
* @param filter
*/
void DialogProcessProperties::updateEnvironmentPage(const QString &filter) {
// tableEnvironment
ui.tableEnvironment->clearContents();
ui.tableEnvironment->setSortingEnabled(false);
ui.tableEnvironment->setRowCount(0);
const QString lower_filter = filter.toLower();
#ifdef Q_OS_LINUX
if (IProcess *process = edb::v1::debugger_core->process()) {
QFile proc_environ(QString("/proc/%1/environ").arg(process->pid()));
if (proc_environ.open(QIODevice::ReadOnly)) {
QByteArray env = proc_environ.readAll();
char *p = env.data();
char *ptr = p;
while (ptr != p + env.size()) {
const QString env = QString::fromUtf8(ptr);
const QString env_name = env.mid(0, env.indexOf("="));
const QString env_value = env.mid(env.indexOf("=") + 1);
if (lower_filter.isEmpty() || env_name.contains(lower_filter, Qt::CaseInsensitive)) {
const int row = ui.tableEnvironment->rowCount();
ui.tableEnvironment->insertRow(row);
ui.tableEnvironment->setItem(row, 0, new QTableWidgetItem(env_name));
ui.tableEnvironment->setItem(row, 1, new QTableWidgetItem(env_value));
}
ptr += qstrlen(ptr) + 1;
}
}
}
#endif
ui.tableEnvironment->setSortingEnabled(true);
}
/**
* @brief DialogProcessProperties::updateHandles
*/
void DialogProcessProperties::updateHandles() {
ui.tableHandles->setSortingEnabled(false);
ui.tableHandles->setRowCount(0);
#ifdef Q_OS_LINUX
if (IProcess *process = edb::v1::debugger_core->process()) {
QDir dir(QString("/proc/%1/fd/").arg(process->pid()));
const QFileInfoList entries = dir.entryInfoList(QStringList() << "[0-9]*");
for (const QFileInfo &info : entries) {
if (info.isSymLink()) {
QString symlink(info.symLinkTarget());
const QString type(file_type(symlink));
if (type == tr("Socket")) {
symlink = process_socket_tcp(&symlink);
symlink = process_socket_udp(&symlink);
symlink = process_socket_unix(&symlink);
}
if (type == tr("Pipe")) {
symlink = tr("FIFO");
}
const int row = ui.tableHandles->rowCount();
ui.tableHandles->insertRow(row);
auto itemFD = new QTableWidgetItem;
itemFD->setData(Qt::DisplayRole, info.fileName().toUInt());
ui.tableHandles->setItem(row, 0, new QTableWidgetItem(type));
ui.tableHandles->setItem(row, 1, itemFD);
ui.tableHandles->setItem(row, 2, new QTableWidgetItem(symlink));
}
}
}
#endif
ui.tableHandles->setSortingEnabled(true);
}
/**
* @brief DialogProcessProperties::showEvent
*/
void DialogProcessProperties::showEvent(QShowEvent *) {
updateGeneralPage();
updateMemoryPage();
updateModulePage();
updateHandles();
updateThreads();
updateEnvironmentPage(ui.txtSearchEnvironment->text());
}
/**
* @brief DialogProcessProperties::on_btnParent_clicked
*/
void DialogProcessProperties::on_btnParent_clicked() {
if (edb::v1::debugger_core) {
if (IProcess *process = edb::v1::debugger_core->process()) {
std::shared_ptr parent = process->parent();
const QString parent_exe = parent ? parent->executable() : QString();
QFileInfo info(parent_exe);
QDir dir = info.absoluteDir();
QDesktopServices::openUrl(QUrl(tr("file://%1").arg(dir.absolutePath()), QUrl::TolerantMode));
}
}
}
/**
* @brief DialogProcessProperties::on_btnImage_clicked
*/
void DialogProcessProperties::on_btnImage_clicked() {
if (edb::v1::debugger_core) {
QFileInfo info(ui.editImage->text());
QDir dir = info.absoluteDir();
QDesktopServices::openUrl(QUrl(tr("file://%1").arg(dir.absolutePath()), QUrl::TolerantMode));
}
}
/**
* @brief DialogProcessProperties::on_btnRefreshEnvironment_clicked
*/
void DialogProcessProperties::on_btnRefreshEnvironment_clicked() {
updateEnvironmentPage(ui.txtSearchEnvironment->text());
}
/**
* @brief DialogProcessProperties::on_btnRefreshHandles_clicked
*/
void DialogProcessProperties::on_btnRefreshHandles_clicked() {
updateHandles();
}
/**
* @brief DialogProcessProperties::on_btnStrings_clicked
*/
void DialogProcessProperties::on_btnStrings_clicked() {
static auto dialog = new DialogStrings(edb::v1::debugger_ui);
dialog->show();
}
/**
* @brief DialogProcessProperties::on_btnRefreshMemory_clicked
*/
void DialogProcessProperties::on_btnRefreshMemory_clicked() {
updateMemoryPage();
}
/**
* @brief DialogProcessProperties::on_btnRefreshThreads_clicked
*/
void DialogProcessProperties::on_btnRefreshThreads_clicked() {
updateThreads();
}
/**
* @brief DialogProcessProperties::updateThreads
*/
void DialogProcessProperties::updateThreads() {
threadsModel_->clear();
if (IProcess *process = edb::v1::debugger_core->process()) {
std::shared_ptr current = process->currentThread();
for (std::shared_ptr &thread : process->threads()) {
if (thread == current) {
threadsModel_->addThread(thread, true);
} else {
threadsModel_->addThread(thread, false);
}
}
}
}
}
edb-debugger/plugins/ProcessProperties/DialogResults.h 0000644 0001750 0001750 00000001361 13765535463 023040 0 ustar eteran eteran
#ifndef PROCESS_PROPERTIES_DIALOG_RESULTS_H_20191119_
#define PROCESS_PROPERTIES_DIALOG_RESULTS_H_20191119_
#include "ResultsModel.h"
#include "ui_DialogResults.h"
#include
#include
class QSortFilterProxyModel;
namespace ProcessPropertiesPlugin {
class DialogResults : public QDialog {
Q_OBJECT
public:
explicit DialogResults(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
public:
void addResult(const ResultsModel::Result &result);
private Q_SLOTS:
void on_tableView_doubleClicked(const QModelIndex &index);
public:
int resultCount() const;
private:
Ui::DialogResults ui;
ResultsModel *model_ = nullptr;
QSortFilterProxyModel *filterModel_ = nullptr;
};
}
#endif
edb-debugger/plugins/ProcessProperties/DialogResults.ui 0000644 0001750 0001750 00000005473 13765535463 023236 0 ustar eteran eteran
ProcessPropertiesPlugin::DialogResults
0
0
690
315
Strings
-
Monospace
Qt::CustomContextMenu
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
false
-
Filter
true
-
Qt::Horizontal
QDialogButtonBox::Close
buttonBox
accepted()
ProcessPropertiesPlugin::DialogResults
accept()
224
326
157
274
buttonBox
rejected()
ProcessPropertiesPlugin::DialogResults
reject()
292
332
286
274
edb-debugger/plugins/ProcessProperties/DialogStrings.cpp 0000644 0001750 0001750 00000010011 13765535463 023353 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "DialogStrings.h"
#include "Configuration.h"
#include "DialogResults.h"
#include "IRegion.h"
#include "MemoryRegions.h"
#include "ResultsModel.h"
#include "edb.h"
#include "util/Math.h"
#include
#include
#include
#include
namespace ProcessPropertiesPlugin {
/**
* @brief DialogStrings::DialogStrings
* @param parent
* @param f
*/
DialogStrings::DialogStrings(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
ui.tableView->verticalHeader()->hide();
ui.tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
filterModel_ = new QSortFilterProxyModel(this);
connect(ui.txtSearch, &QLineEdit::textChanged, filterModel_, &QSortFilterProxyModel::setFilterFixedString);
buttonFind_ = new QPushButton(QIcon::fromTheme("edit-find"), tr("Find"));
connect(buttonFind_, &QPushButton::clicked, this, [this]() {
buttonFind_->setEnabled(false);
ui.progressBar->setValue(0);
doFind();
ui.progressBar->setValue(100);
buttonFind_->setEnabled(true);
});
ui.buttonBox->addButton(buttonFind_, QDialogButtonBox::ActionRole);
}
/**
* @brief DialogStrings::showEvent
*/
void DialogStrings::showEvent(QShowEvent *) {
filterModel_->setFilterKeyColumn(3);
filterModel_->setSourceModel(&edb::v1::memory_regions());
ui.tableView->setModel(filterModel_);
ui.progressBar->setValue(0);
}
/**
* @brief DialogStrings::doFind
*/
void DialogStrings::doFind() {
const int min_string_length = edb::v1::config().min_string_length;
const QItemSelectionModel *const selection_model = ui.tableView->selectionModel();
const QModelIndexList sel = selection_model->selectedRows();
QString str;
if (sel.size() == 0) {
QMessageBox::critical(
this,
tr("No Region Selected"),
tr("You must select a region which is to be scanned for strings."));
return;
}
auto resultsDialog = new DialogResults(this);
for (const QModelIndex &selected_item : sel) {
const QModelIndex index = filterModel_->mapToSource(selected_item);
if (auto region = *reinterpret_cast *>(index.internalPointer())) {
edb::address_t start_address = region->start();
const edb::address_t end_address = region->end();
const edb::address_t orig_start = start_address;
// do the search for this region!
while (start_address < end_address) {
int string_length = 0;
bool ok = edb::v1::get_ascii_string_at_address(start_address, str, min_string_length, 256, string_length);
if (ok) {
resultsDialog->addResult({start_address, str, ResultsModel::Result::Ascii});
} else if (ui.search_unicode->isChecked()) {
string_length = 0;
ok = edb::v1::get_utf16_string_at_address(start_address, str, min_string_length, 256, string_length);
if (ok) {
resultsDialog->addResult({start_address, str, ResultsModel::Result::Utf16});
}
}
ui.progressBar->setValue(util::percentage((start_address - orig_start), region->size()));
if (ok) {
start_address += string_length;
} else {
++start_address;
}
}
}
}
if (resultsDialog->resultCount() == 0) {
QMessageBox::information(this, tr("No Strings Found"), tr("No strings were found in the selected region"));
delete resultsDialog;
} else {
resultsDialog->show();
}
}
}
edb-debugger/plugins/ProcessProperties/ProcessProperties.h 0000644 0001750 0001750 00000002542 13765535463 023754 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef PROCESS_PROPERTIES_H_20100817_
#define PROCESS_PROPERTIES_H_20100817_
#include "IPlugin.h"
class QMenu;
class QDialog;
namespace ProcessPropertiesPlugin {
class ProcessProperties : public QObject, public IPlugin {
Q_OBJECT
Q_INTERFACES(IPlugin)
Q_PLUGIN_METADATA(IID "edb.IPlugin/1.0")
Q_CLASSINFO("author", "Evan Teran")
Q_CLASSINFO("url", "http://www.codef00.com")
public:
explicit ProcessProperties(QObject *parent = nullptr);
~ProcessProperties() override;
public:
QMenu *menu(QWidget *parent = nullptr) override;
public Q_SLOTS:
void showMenu();
private:
QMenu *menu_ = nullptr;
QPointer dialog_ = nullptr;
};
}
#endif
edb-debugger/plugins/ProcessProperties/DialogStrings.h 0000644 0001750 0001750 00000002501 13765535463 023025 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_STRINGS_H_20061101_
#define DIALOG_STRINGS_H_20061101_
#include "Types.h"
#include "ui_DialogStrings.h"
#include
class QSortFilterProxyModel;
class QListWidgetItem;
namespace ProcessPropertiesPlugin {
class DialogStrings : public QDialog {
Q_OBJECT
public:
explicit DialogStrings(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogStrings() override = default;
private:
void showEvent(QShowEvent *event) override;
private:
void doFind();
private:
Ui::DialogStrings ui;
QSortFilterProxyModel *filterModel_ = nullptr;
QPushButton *buttonFind_ = nullptr;
};
}
#endif
edb-debugger/plugins/ProcessProperties/DialogProcessProperties.ui 0000644 0001750 0001750 00000043251 13765535463 025264 0 ustar eteran eteran
Evan Teran
ProcessPropertiesPlugin::DialogProcessProperties
0
0
714
599
Process Properties
-
0
General
-
File
-
Image File Name:
-
true
-
...
..
Qt::NoArrow
-
Process
-
Command Line:
-
true
-
Current Directory:
-
true
-
Started:
-
true
-
Parent:
-
true
-
Qt::Vertical
20
236
-
...
..
Threads
-
Qt::Horizontal
604
20
-
Refresh
..
-
Monospace
8
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
false
Modules
-
Qt::Horizontal
610
20
-
Refresh
..
-
Monospace
8
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
false
Base Address
Name
Memory
-
Strings
-
Qt::Horizontal
467
20
-
Refresh
..
-
Monospace
8
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
false
Address
Size
Protection
Name
Environment
-
-
Filter
-
Refresh
..
-
Monospace
8
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
false
Name
Value
Handles
-
-
Qt::Horizontal
40
20
-
Refresh
..
-
Monospace
8
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
false
Type
Handle
Name
-
QDialogButtonBox::Close
buttonBox
rejected()
ProcessPropertiesPlugin::DialogProcessProperties
reject()
650
574
439
557
buttonBox
accepted()
ProcessPropertiesPlugin::DialogProcessProperties
accept()
30
571
3
554
edb-debugger/plugins/FunctionFinder/ 0000755 0001750 0001750 00000000000 13765535463 017327 5 ustar eteran eteran edb-debugger/plugins/FunctionFinder/DialogResults.cpp 0000644 0001750 0001750 00000013422 13765535463 022616 0 ustar eteran eteran /*
Copyright (C) 2006 - 2019 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "DialogResults.h"
#include "IAnalyzer.h"
#include "ISymbolManager.h"
#include "MemoryRegions.h"
#include "ResultsModel.h"
#include "edb.h"
#ifdef ENABLE_GRAPH
#include "GraphEdge.h"
#include "GraphNode.h"
#include "GraphWidget.h"
#endif
#include
#include
#include
#include
#include
#include
namespace FunctionFinderPlugin {
/**
* @brief DialogResults::DialogResults
* @param parent
* @param f
*/
DialogResults::DialogResults(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
ui.tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
resultsModel_ = new ResultsModel(this);
filterModel_ = new QSortFilterProxyModel(this);
filterModel_->setFilterKeyColumn(5);
filterModel_->setSourceModel(resultsModel_);
connect(ui.textFilter, &QLineEdit::textChanged, filterModel_, &QSortFilterProxyModel::setFilterFixedString);
ui.tableView->setModel(filterModel_);
buttonGraph_ = new QPushButton(QIcon::fromTheme("distribute-graph"), tr("Graph Selected Function"));
#if defined(ENABLE_GRAPH)
connect(buttonGraph_, &QPushButton::clicked, this, [this]() {
// this code is not very pretty...
// but it works!
qDebug("[FunctionFinder] Constructing Graph...");
const QItemSelectionModel *const selModel = ui.tableView->selectionModel();
const QModelIndexList sel = selModel->selectedRows();
if (sel.size() == 1) {
const QModelIndex index = filterModel_->mapToSource(sel[0]);
if (auto item = static_cast(index.internalPointer())) {
const edb::address_t addr = item->startAddress;
if (IAnalyzer *const analyzer = edb::v1::analyzer()) {
const IAnalyzer::FunctionMap &functions = analyzer->functions();
auto it = functions.find(addr);
if (it != functions.end()) {
Function f = *it;
auto graph = new GraphWidget(nullptr);
graph->setAttribute(Qt::WA_DeleteOnClose);
QMap nodes;
// first create all of the nodes
for (const auto &pair : f) {
const BasicBlock &bb = pair.second;
auto node = new GraphNode(graph, bb.toString(), Qt::lightGray);
nodes.insert(bb.firstAddress(), node);
}
// then connect them!
for (const auto &pair : f) {
const BasicBlock &bb = pair.second;
if (!bb.empty()) {
auto term = bb.back();
auto &inst = *term;
if (is_unconditional_jump(inst)) {
Q_ASSERT(inst.operandCount() >= 1);
const auto op = inst[0];
// TODO: we need some heuristic for detecting when this is
// a call/ret -> jmp optimization
if (is_immediate(op)) {
const edb::address_t ea = op->imm;
auto from = nodes.find(bb.firstAddress());
auto to = nodes.find(ea);
if (to != nodes.end() && from != nodes.end()) {
new GraphEdge(from.value(), to.value(), Qt::black);
}
}
} else if (is_conditional_jump(inst)) {
Q_ASSERT(inst.operandCount() == 1);
const auto op = inst[0];
if (is_immediate(op)) {
auto from = nodes.find(bb.firstAddress());
auto to_taken = nodes.find(op->imm);
if (to_taken != nodes.end() && from != nodes.end()) {
new GraphEdge(from.value(), to_taken.value(), Qt::green);
}
auto to_skipped = nodes.find(inst.rva() + inst.byteSize());
if (to_taken != nodes.end() && from != nodes.end()) {
new GraphEdge(from.value(), to_skipped.value(), Qt::red);
}
}
} else if (is_terminator(inst)) {
}
}
}
graph->layout();
graph->show();
}
}
}
}
});
#endif
ui.buttonBox->addButton(buttonGraph_, QDialogButtonBox::ActionRole);
#ifdef ENABLE_GRAPH
buttonGraph_->setEnabled(true);
#else
buttonGraph_->setEnabled(false);
#endif
}
/**
* @brief DialogResults::on_tableView_doubleClicked
* @param index
*/
void DialogResults::on_tableView_doubleClicked(const QModelIndex &index) {
if (index.isValid()) {
const QModelIndex realIndex = filterModel_->mapToSource(index);
if (auto item = static_cast(realIndex.internalPointer())) {
edb::v1::jump_to_address(item->startAddress);
}
}
}
/**
* @brief DialogResults::addResult
* @param function
*/
void DialogResults::addResult(const Function &function) {
ResultsModel::Result result;
// entry point
result.startAddress = function.entryAddress();
// upper bound of the function
result.endAddress = function.endAddress();
result.size = function.endAddress() - function.entryAddress() + 1;
// reference count
result.score = function.referenceCount();
// type
result.type = function.type();
QString symbol_name = edb::v1::symbol_manager().findAddressName(function.entryAddress());
if (!symbol_name.isEmpty()) {
result.symbol = symbol_name;
}
resultsModel_->addResult(result);
}
/**
* @brief DialogResults::resultCount
* @return
*/
int DialogResults::resultCount() const {
return resultsModel_->rowCount();
}
}
edb-debugger/plugins/FunctionFinder/FunctionFinder.h 0000644 0001750 0001750 00000002521 13765535463 022415 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef FUNCTION_FINDER_H_20060430_
#define FUNCTION_FINDER_H_20060430_
#include "IPlugin.h"
class QMenu;
class QDialog;
namespace FunctionFinderPlugin {
class FunctionFinder : public QObject, public IPlugin {
Q_OBJECT
Q_INTERFACES(IPlugin)
Q_PLUGIN_METADATA(IID "edb.IPlugin/1.0")
Q_CLASSINFO("author", "Evan Teran")
Q_CLASSINFO("url", "http://www.codef00.com")
public:
explicit FunctionFinder(QObject *parent = nullptr);
~FunctionFinder() override;
public:
QMenu *menu(QWidget *parent = nullptr) override;
public Q_SLOTS:
void showMenu();
private:
QMenu *menu_ = nullptr;
QPointer dialog_ = nullptr;
};
}
#endif
edb-debugger/plugins/FunctionFinder/ResultsModel.cpp 0000644 0001750 0001750 00000012421 13765535463 022455 0 ustar eteran eteran /*
Copyright (C) 2006 - 2019 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "ResultsModel.h"
#include "edb.h"
#include
namespace FunctionFinderPlugin {
/**
* @brief ResultsModel::ResultsModel
* @param parent
*/
ResultsModel::ResultsModel(QObject *parent)
: QAbstractItemModel(parent) {
}
/**
* @brief ResultsModel::headerData
* @param section
* @param orientation
* @param role
* @return
*/
QVariant ResultsModel::headerData(int section, Qt::Orientation orientation, int role) const {
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return tr("Start Address");
case 1:
return tr("End Address");
case 2:
return tr("Size");
case 3:
return tr("Score");
case 4:
return tr("Type");
case 5:
return tr("Symbol");
}
}
return QVariant();
}
/**
* @brief ResultsModel::data
* @param index
* @param role
* @return
*/
QVariant ResultsModel::data(const QModelIndex &index, int role) const {
if (!index.isValid()) {
return QVariant();
}
const Result &result = results_[index.row()];
if (role == Qt::DisplayRole) {
switch (index.column()) {
case 0:
return edb::v1::format_pointer(result.startAddress);
case 1:
return edb::v1::format_pointer(result.endAddress);
case 2:
return static_cast(result.size);
case 3:
return result.score;
case 4:
return result.type == Function::Thunk ? tr("Thunk") : tr("Standard Function");
case 5:
return result.symbol;
default:
return QVariant();
}
}
return QVariant();
}
/**
* @brief ResultsModel::addResult
* @param r
*/
void ResultsModel::addResult(const Result &r) {
beginInsertRows(QModelIndex(), rowCount(), rowCount());
results_.push_back(r);
endInsertRows();
}
/**
* @brief ResultsModel::index
* @param row
* @param column
* @param parent
* @return
*/
QModelIndex ResultsModel::index(int row, int column, const QModelIndex &parent) const {
Q_UNUSED(parent)
if (row >= results_.size()) {
return QModelIndex();
}
if (column >= 6) {
return QModelIndex();
}
if (row >= 0) {
return createIndex(row, column, const_cast(&results_[row]));
} else {
return createIndex(row, column);
}
}
/**
* @brief ResultsModel::parent
* @param index
* @return
*/
QModelIndex ResultsModel::parent(const QModelIndex &index) const {
Q_UNUSED(index)
return QModelIndex();
}
/**
* @brief ResultsModel::rowCount
* @param parent
* @return
*/
int ResultsModel::rowCount(const QModelIndex &parent) const {
Q_UNUSED(parent)
return results_.size();
}
/**
* @brief ResultsModel::columnCount
* @param parent
* @return
*/
int ResultsModel::columnCount(const QModelIndex &parent) const {
Q_UNUSED(parent)
return 6;
}
/**
* @brief ResultsModel::sort
* @param column
* @param order
*/
void ResultsModel::sort(int column, Qt::SortOrder order) {
if (order == Qt::AscendingOrder) {
switch (column) {
case 0:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.startAddress < s2.startAddress; });
break;
case 1:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.endAddress < s2.endAddress; });
break;
case 2:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.size < s2.size; });
break;
case 3:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.score < s2.score; });
break;
case 4:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.type < s2.type; });
break;
case 5:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.symbol < s2.symbol; });
break;
}
} else {
switch (column) {
case 0:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.startAddress > s2.startAddress; });
break;
case 1:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.endAddress > s2.endAddress; });
break;
case 2:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.size > s2.size; });
break;
case 3:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.score > s2.score; });
break;
case 4:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.type > s2.type; });
break;
case 5:
std::sort(results_.begin(), results_.end(), [](const Result &s1, const Result &s2) { return s1.symbol > s2.symbol; });
break;
}
}
Q_EMIT dataChanged(createIndex(0, 0, nullptr), createIndex(-1, -1, nullptr));
}
}
edb-debugger/plugins/FunctionFinder/ResultsModel.h 0000644 0001750 0001750 00000003670 13765535463 022130 0 ustar eteran eteran /*
Copyright (C) 2006 - 2019 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef RESULTS_MODEL_H_20070419_
#define RESULTS_MODEL_H_20070419_
#include "Function.h"
#include "Types.h"
#include
#include
namespace FunctionFinderPlugin {
class ResultsModel : public QAbstractItemModel {
Q_OBJECT
public:
struct Result {
edb::address_t startAddress = 0;
edb::address_t endAddress = 0;
size_t size = 0;
int score = 0;
Function::Type type = Function::Type::Standard;
QString symbol;
};
public:
explicit ResultsModel(QObject *parent = nullptr);
public:
QVariant data(const QModelIndex &index, int role) const override;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &index) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
public:
void addResult(const Result &r);
public:
const QVector &results() const { return results_; }
private:
QVector results_;
};
}
#endif
edb-debugger/plugins/FunctionFinder/CMakeLists.txt 0000644 0001750 0001750 00000001657 13765535463 022100 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
include("GNUInstallDirs")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(PluginName "FunctionFinder")
find_package(Qt5 5.0.0 REQUIRED Widgets)
add_library(${PluginName} SHARED
DialogFunctions.cpp
DialogFunctions.h
DialogFunctions.ui
DialogResults.cpp
DialogResults.h
DialogResults.ui
FunctionFinder.cpp
FunctionFinder.h
ResultsModel.h
ResultsModel.cpp
)
target_link_libraries(${PluginName} Qt5::Widgets edb)
install (TARGETS ${PluginName} DESTINATION ${CMAKE_INSTALL_LIBDIR}/edb)
set_property(TARGET ${PluginName} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD 14)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${PluginName} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set_property(TARGET ${PluginName} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
edb-debugger/plugins/FunctionFinder/DialogResults.h 0000644 0001750 0001750 00000002705 13765535463 022265 0 ustar eteran eteran /*
Copyright (C) 2006 - 2019 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_RESULTS_H_20190403_
#define DIALOG_RESULTS_H_20190403_
#include "Types.h"
#include "ui_DialogResults.h"
#include
class QSortFilterProxyModel;
class IAnalyzer;
class Function;
namespace FunctionFinderPlugin {
class ResultsModel;
class DialogResults : public QDialog {
Q_OBJECT
public:
explicit DialogResults(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogResults() override = default;
public:
void addResult(const Function &function);
int resultCount() const;
public Q_SLOTS:
void on_tableView_doubleClicked(const QModelIndex &index);
private:
Ui::DialogResults ui;
QSortFilterProxyModel *filterModel_ = nullptr;
ResultsModel *resultsModel_ = nullptr;
QPushButton *buttonGraph_ = nullptr;
};
}
#endif
edb-debugger/plugins/FunctionFinder/DialogResults.ui 0000644 0001750 0001750 00000005224 13765535463 022452 0 ustar eteran eteran
FunctionFinderPlugin::DialogResults
0
0
850
450
Functions Found
-
Filter
true
-
Monospace
Qt::CustomContextMenu
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
false
-
QDialogButtonBox::Close
buttonBox
accepted()
FunctionFinderPlugin::DialogResults
accept()
791
422
788
406
buttonBox
rejected()
FunctionFinderPlugin::DialogResults
reject()
810
423
826
407
edb-debugger/plugins/FunctionFinder/DialogFunctions.h 0000644 0001750 0001750 00000002465 13765535463 022577 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_FUNCTIONS_H_20061101_
#define DIALOG_FUNCTIONS_H_20061101_
#include "Types.h"
#include "ui_DialogFunctions.h"
#include
class QSortFilterProxyModel;
namespace FunctionFinderPlugin {
class DialogFunctions : public QDialog {
Q_OBJECT
public:
explicit DialogFunctions(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogFunctions() override = default;
private:
void showEvent(QShowEvent *event) override;
private:
void doFind();
private:
Ui::DialogFunctions ui;
QSortFilterProxyModel *filterModel_ = nullptr;
QPushButton *buttonFind_ = nullptr;
};
}
#endif
edb-debugger/plugins/FunctionFinder/DialogFunctions.ui 0000644 0001750 0001750 00000006111 13765535463 022755 0 ustar eteran eteran
Evan Teran
FunctionFinderPlugin::DialogFunctions
0
0
640
400
Function Finder
-
Regions To Search:
-
Filter
true
-
Monospace
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
true
false
true
false
-
QDialogButtonBox::Close
-
0
Qt::Horizontal
tableView
txtSearch
buttonBox
accepted()
FunctionFinderPlugin::DialogFunctions
accept()
161
353
113
338
buttonBox
rejected()
FunctionFinderPlugin::DialogFunctions
reject()
346
358
361
340
edb-debugger/plugins/FunctionFinder/FunctionFinder.cpp 0000644 0001750 0001750 00000003050 13765535463 022746 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "FunctionFinder.h"
#include "DialogFunctions.h"
#include "edb.h"
#include
namespace FunctionFinderPlugin {
/**
* @brief FunctionFinder::FunctionFinder
* @param parent
*/
FunctionFinder::FunctionFinder(QObject *parent)
: QObject(parent) {
}
/**
* @brief FunctionFinder::~FunctionFinder
*/
FunctionFinder::~FunctionFinder() {
delete dialog_;
}
/**
* @brief FunctionFinder::menu
* @param parent
* @return
*/
QMenu *FunctionFinder::menu(QWidget *parent) {
Q_ASSERT(parent);
if (!menu_) {
menu_ = new QMenu(tr("FunctionFinder"), parent);
menu_->addAction(tr("&Function Finder"), this, SLOT(showMenu()), QKeySequence(tr("Ctrl+Shift+F")));
}
return menu_;
}
/**
* @brief FunctionFinder::showMenu
*/
void FunctionFinder::showMenu() {
if (!dialog_) {
dialog_ = new DialogFunctions(edb::v1::debugger_ui);
}
dialog_->show();
}
}
edb-debugger/plugins/FunctionFinder/DialogFunctions.cpp 0000644 0001750 0001750 00000006730 13765535463 023131 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "DialogFunctions.h"
#include "DialogResults.h"
#include "IAnalyzer.h"
#include "MemoryRegions.h"
#include "edb.h"
#include
#include
#include
#include
#include
#include
namespace FunctionFinderPlugin {
/**
* @brief DialogFunctions::DialogFunctions
* @param parent
* @param f
*/
DialogFunctions::DialogFunctions(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
ui.tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
filterModel_ = new QSortFilterProxyModel(this);
connect(ui.txtSearch, &QLineEdit::textChanged, filterModel_, &QSortFilterProxyModel::setFilterFixedString);
buttonFind_ = new QPushButton(QIcon::fromTheme("edit-find"), tr("Find"));
connect(buttonFind_, &QPushButton::clicked, this, [this]() {
buttonFind_->setEnabled(false);
ui.progressBar->setValue(0);
doFind();
ui.progressBar->setValue(100);
buttonFind_->setEnabled(true);
});
ui.buttonBox->addButton(buttonFind_, QDialogButtonBox::ActionRole);
}
/**
* @brief DialogFunctions::showEvent
*/
void DialogFunctions::showEvent(QShowEvent *) {
filterModel_->setFilterKeyColumn(3);
filterModel_->setSourceModel(&edb::v1::memory_regions());
ui.tableView->setModel(filterModel_);
ui.progressBar->setValue(0);
}
/**
* @brief DialogFunctions::doFind
*/
void DialogFunctions::doFind() {
if (IAnalyzer *const analyzer = edb::v1::analyzer()) {
const QItemSelectionModel *const selModel = ui.tableView->selectionModel();
const QModelIndexList sel = selModel->selectedRows();
if (sel.size() == 0) {
QMessageBox::critical(this, tr("No Region Selected"), tr("You must select a region which is to be scanned for functions."));
return;
}
auto analyzer_object = dynamic_cast(analyzer);
if (analyzer_object) {
connect(analyzer_object, SIGNAL(updateProgress(int)), ui.progressBar, SLOT(setValue(int)));
}
auto resultsDialog = new DialogResults(this);
for (const QModelIndex &selected_item : sel) {
const QModelIndex index = filterModel_->mapToSource(selected_item);
// do the search for this region!
if (auto region = *reinterpret_cast *>(index.internalPointer())) {
analyzer->analyze(region);
const IAnalyzer::FunctionMap &results = analyzer->functions(region);
for (const Function &function : results) {
resultsDialog->addResult(function);
}
}
}
if (resultsDialog->resultCount() == 0) {
QMessageBox::information(this, tr("No Results"), tr("No Functions Found!"));
delete resultsDialog;
} else {
resultsDialog->show();
}
if (analyzer_object) {
disconnect(analyzer_object, SIGNAL(updateProgress(int)), ui.progressBar, SLOT(setValue(int)));
}
}
}
}
edb-debugger/plugins/HardwareBreakpoints/ 0000755 0001750 0001750 00000000000 13765535463 020351 5 ustar eteran eteran edb-debugger/plugins/HardwareBreakpoints/DialogHwBreakpoints.cpp 0000644 0001750 0001750 00000007132 13765535463 024760 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "DialogHwBreakpoints.h"
#include "IDebugger.h"
#include "IProcess.h"
#include "IThread.h"
#include "State.h"
#include "edb.h"
#include "libHardwareBreakpoints.h"
namespace HardwareBreakpointsPlugin {
/**
* @brief DialogHwBreakpoints::DialogHwBreakpoints
* @param parent
* @param f
*/
DialogHwBreakpoints::DialogHwBreakpoints(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
connect(ui.cmbType1, SIGNAL(currentIndexChanged(int)), this, SLOT(type1IndexChanged(int)));
connect(ui.cmbType2, SIGNAL(currentIndexChanged(int)), this, SLOT(type2IndexChanged(int)));
connect(ui.cmbType3, SIGNAL(currentIndexChanged(int)), this, SLOT(type3IndexChanged(int)));
connect(ui.cmbType4, SIGNAL(currentIndexChanged(int)), this, SLOT(type4IndexChanged(int)));
}
/**
* @brief DialogHwBreakpoints::type1IndexChanged
* @param index
*/
void DialogHwBreakpoints::type1IndexChanged(int index) {
ui.cmbSize1->setEnabled(index != 0);
}
/**
* @brief DialogHwBreakpoints::type2IndexChanged
* @param index
*/
void DialogHwBreakpoints::type2IndexChanged(int index) {
ui.cmbSize2->setEnabled(index != 0);
}
/**
* @brief DialogHwBreakpoints::type3IndexChanged
* @param index
*/
void DialogHwBreakpoints::type3IndexChanged(int index) {
ui.cmbSize3->setEnabled(index != 0);
}
/**
* @brief DialogHwBreakpoints::type4IndexChanged
* @param index
*/
void DialogHwBreakpoints::type4IndexChanged(int index) {
ui.cmbSize4->setEnabled(index != 0);
}
/**
* @brief DialogHwBreakpoints::showEvent
* @param event
*/
void DialogHwBreakpoints::showEvent(QShowEvent *event) {
Q_UNUSED(event)
if (IProcess *process = edb::v1::debugger_core->process()) {
State state;
process->currentThread()->getState(&state);
const BreakpointState bp_state1 = breakpoint_state(&state, Register1);
const BreakpointState bp_state2 = breakpoint_state(&state, Register2);
const BreakpointState bp_state3 = breakpoint_state(&state, Register3);
const BreakpointState bp_state4 = breakpoint_state(&state, Register4);
ui.chkBP1->setChecked(bp_state1.enabled);
ui.chkBP2->setChecked(bp_state2.enabled);
ui.chkBP3->setChecked(bp_state3.enabled);
ui.chkBP4->setChecked(bp_state4.enabled);
if (bp_state1.enabled) {
ui.txtBP1->setText(bp_state1.addr.toPointerString());
ui.cmbSize1->setCurrentIndex(bp_state1.size);
ui.cmbType1->setCurrentIndex(bp_state1.type);
}
if (bp_state2.enabled) {
ui.txtBP2->setText(bp_state2.addr.toPointerString());
ui.cmbSize2->setCurrentIndex(bp_state2.size);
ui.cmbType2->setCurrentIndex(bp_state2.type);
}
if (bp_state3.enabled) {
ui.txtBP3->setText(bp_state3.addr.toPointerString());
ui.cmbSize3->setCurrentIndex(bp_state3.size);
ui.cmbType3->setCurrentIndex(bp_state3.type);
}
if (bp_state4.enabled) {
ui.txtBP4->setText(bp_state4.addr.toPointerString());
ui.cmbSize4->setCurrentIndex(bp_state4.size);
ui.cmbType4->setCurrentIndex(bp_state4.type);
}
}
}
}
edb-debugger/plugins/HardwareBreakpoints/HardwareBreakpoints.cpp 0000644 0001750 0001750 00000045102 13765535463 025016 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "HardwareBreakpoints.h"
#include "DialogHwBreakpoints.h"
#include "IDebugEvent.h"
#include "IDebugger.h"
#include "IProcess.h"
#include "IThread.h"
#include "State.h"
#include "edb.h"
#include
#include
#include
#include
#include "ui_DialogHwBreakpoints.h"
// TODO: at the moment, nearly this entire file is x86/x86-64 specific
// we need to figure out a proper way to support (if at all) non
// x86 arches
#if !(defined(EDB_X86_64) || defined(EDB_X86))
#error "Unsupported Platform"
#endif
namespace HardwareBreakpointsPlugin {
/**
* @brief HardwareBreakpoints::HardwareBreakpoints
* @param parent
*/
HardwareBreakpoints::HardwareBreakpoints(QObject *parent)
: QObject(parent) {
}
/**
* @brief HardwareBreakpoints::private_init
*/
void HardwareBreakpoints::privateInit() {
auto dialog = new DialogHwBreakpoints(edb::v1::debugger_ui);
dialog_ = dialog;
// indexed access to members for simplicity later
enabled_[Register1] = dialog->ui.chkBP1;
enabled_[Register2] = dialog->ui.chkBP2;
enabled_[Register3] = dialog->ui.chkBP3;
enabled_[Register4] = dialog->ui.chkBP4;
types_[Register1] = dialog->ui.cmbType1;
types_[Register2] = dialog->ui.cmbType2;
types_[Register3] = dialog->ui.cmbType3;
types_[Register4] = dialog->ui.cmbType4;
sizes_[Register1] = dialog->ui.cmbSize1;
sizes_[Register2] = dialog->ui.cmbSize2;
sizes_[Register3] = dialog->ui.cmbSize3;
sizes_[Register4] = dialog->ui.cmbSize4;
addresses_[Register1] = dialog->ui.txtBP1;
addresses_[Register2] = dialog->ui.txtBP2;
addresses_[Register3] = dialog->ui.txtBP3;
addresses_[Register4] = dialog->ui.txtBP4;
edb::v1::add_debug_event_handler(this);
}
/**
* @brief HardwareBreakpoints::privateFini
*/
void HardwareBreakpoints::privateFini() {
edb::v1::remove_debug_event_handler(this);
}
/**
* @brief HardwareBreakpoints::menu
* @param parent
* @return
*/
QMenu *HardwareBreakpoints::menu(QWidget *parent) {
Q_ASSERT(parent);
if (!menu_) {
menu_ = new QMenu(tr("Hardware BreakpointManager"), parent);
menu_->addAction(tr("&Hardware Breakpoints"), this, SLOT(showMenu()), QKeySequence(tr("Ctrl+Shift+H")));
}
return menu_;
}
/**
* @brief HardwareBreakpoints::setupBreakpoints
*/
void HardwareBreakpoints::setupBreakpoints() {
if (IProcess *process = edb::v1::debugger_core->process()) {
if (!process->isPaused()) {
QMessageBox::warning(
nullptr,
tr("Process Not Paused"),
tr("Unable to update hardware breakpoints because the process does not appear to be currently paused. Please suspend the process."));
return;
}
const bool enabled =
enabled_[Register1]->isChecked() ||
enabled_[Register2]->isChecked() ||
enabled_[Register3]->isChecked() ||
enabled_[Register4]->isChecked();
if (enabled) {
edb::address_t addr[RegisterCount];
bool ok[RegisterCount];
// evaluate all the expressions
for (int i = 0; i < RegisterCount; ++i) {
ok[i] = enabled_[i]->isChecked() && edb::v1::eval_expression(addresses_[i]->text(), &addr[i]);
}
if (!ok[Register1] && !ok[Register2] && !ok[Register3] && !ok[Register4]) {
QMessageBox::critical(
nullptr,
tr("Address Error"),
tr("An address expression provided does not appear to be valid"));
return;
}
for (int i = 0; i < RegisterCount; ++i) {
if (ok[i]) {
const BreakpointStatus status = validate_breakpoint({enabled_[i]->isChecked(),
addr[i],
types_[i]->currentIndex(),
sizes_[i]->currentIndex()});
switch (status) {
case AlignmentError:
QMessageBox::critical(
nullptr,
tr("Address Alignment Error"),
tr("Hardware read/write breakpoint address must be aligned to breakpoint size."));
return;
case SizeError:
QMessageBox::critical(
nullptr,
tr("BP Size Error"),
tr("Hardware read/write breakpoints cannot be 8-bytes in a 32-bit debuggee."));
return;
case Valid:
break;
}
}
}
for (std::shared_ptr &thread : process->threads()) {
State state;
thread->getState(&state);
for (int i = 0; i < RegisterCount; ++i) {
if (ok[i]) {
set_breakpoint_state(
&state,
i,
{enabled_[i]->isChecked(),
addr[i],
types_[i]->currentIndex(),
sizes_[i]->currentIndex()});
}
}
thread->setState(state);
}
} else {
for (std::shared_ptr &thread : process->threads()) {
State state;
thread->getState(&state);
state.setDebugRegister(7, 0);
thread->setState(state);
}
}
}
edb::v1::update_ui();
}
/**
* @brief HardwareBreakpoints::showMenu
*/
void HardwareBreakpoints::showMenu() {
if (dialog_->exec() == QDialog::Accepted) {
setupBreakpoints();
}
}
/**
* @brief HardwareBreakpoints::handleEvent
*
* this hooks the debug event handler so we can make the breakpoints able to be resumed
*
* @param event
* @return
*/
edb::EventStatus HardwareBreakpoints::handleEvent(const std::shared_ptr &event) {
if (event->stopped() && event->isTrap()) {
if (IProcess *process = edb::v1::debugger_core->process()) {
if (std::shared_ptr thread = process->currentThread()) {
// check DR6 to see if it was a HW BP event
// if so, set the resume flag
State state;
thread->getState(&state);
if ((state.debugRegister(6) & 0x0f) != 0x00) {
state.setFlags(state.flags() | (1 << 16));
thread->setState(state);
}
}
}
}
// pass the event down the stack
return edb::DEBUG_NEXT_HANDLER;
}
/**
* @brief HardwareBreakpoints::stackContextMenu
* @return
*/
QList HardwareBreakpoints::stackContextMenu() {
auto menu = new QMenu(tr("Hardware Breakpoints"));
auto rw1 = menu->addAction(tr("Hardware, On Read/Write #1"), this, SLOT(setAccess1()));
auto rw2 = menu->addAction(tr("Hardware, On Read/Write #2"), this, SLOT(setAccess2()));
auto rw3 = menu->addAction(tr("Hardware, On Read/Write #3"), this, SLOT(setAccess3()));
auto rw4 = menu->addAction(tr("Hardware, On Read/Write #4"), this, SLOT(setAccess4()));
auto wo1 = menu->addAction(tr("Hardware, On Write #1"), this, SLOT(setWrite1()));
auto wo2 = menu->addAction(tr("Hardware, On Write #2"), this, SLOT(setWrite2()));
auto wo3 = menu->addAction(tr("Hardware, On Write #3"), this, SLOT(setWrite3()));
auto wo4 = menu->addAction(tr("Hardware, On Write #4"), this, SLOT(setWrite4()));
rw1->setData(1);
rw2->setData(1);
rw3->setData(1);
rw4->setData(1);
wo1->setData(1);
wo2->setData(1);
wo3->setData(1);
wo4->setData(1);
QList ret;
auto action = new QAction(tr("Hardware Breakpoints"), this);
action->setMenu(menu);
ret << action;
return ret;
}
/**
* @brief HardwareBreakpoints::dataContextMenu
* @return
*/
QList HardwareBreakpoints::dataContextMenu() {
auto menu = new QMenu(tr("Hardware Breakpoints"));
auto rw1 = menu->addAction(tr("Hardware, On Read/Write #1"), this, SLOT(setAccess1()));
auto rw2 = menu->addAction(tr("Hardware, On Read/Write #2"), this, SLOT(setAccess2()));
auto rw3 = menu->addAction(tr("Hardware, On Read/Write #3"), this, SLOT(setAccess3()));
auto rw4 = menu->addAction(tr("Hardware, On Read/Write #4"), this, SLOT(setAccess4()));
auto wo1 = menu->addAction(tr("Hardware, On Write #1"), this, SLOT(setWrite1()));
auto wo2 = menu->addAction(tr("Hardware, On Write #2"), this, SLOT(setWrite2()));
auto wo3 = menu->addAction(tr("Hardware, On Write #3"), this, SLOT(setWrite3()));
auto wo4 = menu->addAction(tr("Hardware, On Write #4"), this, SLOT(setWrite4()));
rw1->setData(2);
rw2->setData(2);
rw3->setData(2);
rw4->setData(2);
wo1->setData(2);
wo2->setData(2);
wo3->setData(2);
wo4->setData(2);
QList ret;
auto action = new QAction(tr("Hardware Breakpoints"), this);
action->setMenu(menu);
ret << action;
return ret;
}
/**
* @brief HardwareBreakpoints::cpuContextMenu
* @return
*/
QList HardwareBreakpoints::cpuContextMenu() {
auto menu = new QMenu(tr("Hardware Breakpoints"));
auto ex1 = menu->addAction(tr("Hardware, On Execute #1"), this, SLOT(setExec1()));
auto ex2 = menu->addAction(tr("Hardware, On Execute #2"), this, SLOT(setExec2()));
auto ex3 = menu->addAction(tr("Hardware, On Execute #3"), this, SLOT(setExec3()));
auto ex4 = menu->addAction(tr("Hardware, On Execute #4"), this, SLOT(setExec4()));
auto rw1 = menu->addAction(tr("Hardware, On Read/Write #1"), this, SLOT(setAccess1()));
auto rw2 = menu->addAction(tr("Hardware, On Read/Write #2"), this, SLOT(setAccess2()));
auto rw3 = menu->addAction(tr("Hardware, On Read/Write #3"), this, SLOT(setAccess3()));
auto rw4 = menu->addAction(tr("Hardware, On Read/Write #4"), this, SLOT(setAccess4()));
auto wo1 = menu->addAction(tr("Hardware, On Write #1"), this, SLOT(setWrite1()));
auto wo2 = menu->addAction(tr("Hardware, On Write #2"), this, SLOT(setWrite2()));
auto wo3 = menu->addAction(tr("Hardware, On Write #3"), this, SLOT(setWrite3()));
auto wo4 = menu->addAction(tr("Hardware, On Write #4"), this, SLOT(setWrite4()));
ex1->setData(3);
ex2->setData(3);
ex3->setData(3);
ex4->setData(3);
rw1->setData(3);
rw2->setData(3);
rw3->setData(3);
rw4->setData(3);
wo1->setData(3);
wo2->setData(3);
wo3->setData(3);
wo4->setData(3);
QList ret;
auto action = new QAction(tr("Hardware Breakpoints"), this);
action->setMenu(menu);
ret << action;
return ret;
}
/**
* @brief HardwareBreakpoints::setExecuteBP
* @param index
* @param inUse
*/
void HardwareBreakpoints::setExecuteBP(int index, bool inUse) {
if (IProcess *process = edb::v1::debugger_core->process()) {
if (!process->isPaused()) {
QMessageBox::warning(
nullptr,
tr("Process Not Paused"),
tr("Unable to update hardware breakpoints because the process does not appear to be currently paused. Please suspend the process."));
return;
}
if (inUse) {
QMessageBox::StandardButton button = QMessageBox::question(nullptr, tr("Breakpoint Already In Use"), tr("This breakpoint is already being used. Do you want to replace it?"), QMessageBox::Yes | QMessageBox::Cancel);
if (button != QMessageBox::Yes) {
return;
}
}
edb::address_t address = edb::v1::cpu_selected_address();
for (std::shared_ptr &thread : process->threads()) {
State state;
thread->getState(&state);
set_breakpoint_state(&state, index, {true, address, 0, 0});
thread->setState(state);
}
}
edb::v1::update_ui();
}
/**
* @brief HardwareBreakpoints::setWriteBP
* @param index
* @param inUse
* @param address
* @param size
*/
void HardwareBreakpoints::setWriteBP(int index, bool inUse, edb::address_t address, size_t size) {
if (IProcess *process = edb::v1::debugger_core->process()) {
if (!process->isPaused()) {
QMessageBox::warning(
nullptr,
tr("Process Not Paused"),
tr("Unable to update hardware breakpoints because the process does not appear to be currently paused. Please suspend the process."));
return;
}
if (inUse) {
QMessageBox::StandardButton button = QMessageBox::question(nullptr, tr("Breakpoint Already In Use"), tr("This breakpoint is already being used. Do you want to replace it?"), QMessageBox::Yes | QMessageBox::Cancel);
if (button != QMessageBox::Yes) {
return;
}
}
for (std::shared_ptr &thread : process->threads()) {
State state;
thread->getState(&state);
switch (size) {
case 1:
set_breakpoint_state(&state, index, {true, address, 1, 0});
break;
case 2:
set_breakpoint_state(&state, index, {true, address, 1, 1});
break;
case 4:
set_breakpoint_state(&state, index, {true, address, 1, 2});
break;
case 8:
set_breakpoint_state(&state, index, {true, address, 1, 3});
break;
default:
QMessageBox::critical(nullptr, tr("Invalid Selection Size"), tr("Please select 1, 2, 4, or 8 bytes for this type of hardware breakpoint"));
return;
}
thread->setState(state);
}
}
edb::v1::update_ui();
}
/**
* @brief HardwareBreakpoints::setReadWriteBP
* @param index
* @param inUse
* @param address
* @param size
*/
void HardwareBreakpoints::setReadWriteBP(int index, bool inUse, edb::address_t address, size_t size) {
if (IProcess *process = edb::v1::debugger_core->process()) {
if (!process->isPaused()) {
QMessageBox::warning(
nullptr,
tr("Process Not Paused"),
tr("Unable to update hardware breakpoints because the process does not appear to be currently paused. Please suspend the process."));
return;
}
if (inUse) {
QMessageBox::StandardButton button = QMessageBox::question(
nullptr,
tr("Breakpoint Already In Use"),
tr("This breakpoint is already being used. Do you want to replace it?"),
QMessageBox::Yes | QMessageBox::Cancel);
if (button != QMessageBox::Yes) {
return;
}
}
for (std::shared_ptr &thread : process->threads()) {
State state;
thread->getState(&state);
switch (size) {
case 1:
set_breakpoint_state(&state, index, {true, address, 2, 0});
break;
case 2:
set_breakpoint_state(&state, index, {true, address, 2, 1});
break;
case 4:
set_breakpoint_state(&state, index, {true, address, 2, 2});
break;
case 8:
set_breakpoint_state(&state, index, {true, address, 2, 3});
break;
default:
QMessageBox::critical(nullptr, tr("Invalid Selection Size"), tr("Please select 1, 2, 4, or 8 bytes for this type of hardward breakpoint"));
return;
}
thread->setState(state);
}
}
edb::v1::update_ui();
}
/**
* @brief HardwareBreakpoints::setExec
* @param index
*/
void HardwareBreakpoints::setExec(int index) {
if (auto a = qobject_cast(sender())) {
switch (a->data().toLongLong()) {
case 3:
setExecuteBP(index, enabled_[index]->isChecked());
break;
default:
Q_ASSERT(0 && "Internal Error");
break;
}
}
}
/**
* @brief HardwareBreakpoints::setWrite
* @param index
*/
void HardwareBreakpoints::setWrite(int index) {
if (auto a = qobject_cast(sender())) {
switch (a->data().toLongLong()) {
case 1:
setStackWriteBP(index, enabled_[index]->isChecked());
break;
case 2:
setDataWriteBP(index, enabled_[index]->isChecked());
break;
case 3:
setCPUWriteBP(index, enabled_[index]->isChecked());
break;
default:
Q_ASSERT(0 && "Internal Error");
break;
}
}
}
/**
* @brief HardwareBreakpoints::setAccess
* @param index
*/
void HardwareBreakpoints::setAccess(int index) {
if (auto a = qobject_cast(sender())) {
switch (a->data().toLongLong()) {
case 1:
setStackReadWriteBP(index, enabled_[index]->isChecked());
break;
case 2:
setDataReadWriteBP(index, enabled_[index]->isChecked());
break;
case 3:
setCPUReadWriteBP(index, enabled_[index]->isChecked());
break;
default:
Q_ASSERT(0 && "Internal Error");
break;
}
}
}
/**
* @brief HardwareBreakpoints::setDataReadWriteBP
* @param index
* @param inUse
*/
void HardwareBreakpoints::setDataReadWriteBP(int index, bool inUse) {
const edb::address_t address = edb::v1::selected_data_address();
const size_t size = edb::v1::selected_data_size();
setReadWriteBP(index, inUse, address, size);
}
/**
* @brief HardwareBreakpoints::setDataWriteBP
* @param index
* @param inUse
*/
void HardwareBreakpoints::setDataWriteBP(int index, bool inUse) {
const edb::address_t address = edb::v1::selected_data_address();
const size_t size = edb::v1::selected_data_size();
setReadWriteBP(index, inUse, address, size);
}
/**
* @brief HardwareBreakpoints::setStackReadWriteBP
* @param index
* @param inUse
*/
void HardwareBreakpoints::setStackReadWriteBP(int index, bool inUse) {
const edb::address_t address = edb::v1::selected_stack_address();
const size_t size = edb::v1::selected_stack_size();
setReadWriteBP(index, inUse, address, size);
}
/**
* @brief HardwareBreakpoints::setStackWriteBP
* @param index
* @param inUse
*/
void HardwareBreakpoints::setStackWriteBP(int index, bool inUse) {
const edb::address_t address = edb::v1::selected_stack_address();
const size_t size = edb::v1::selected_stack_size();
setWriteBP(index, inUse, address, size);
}
/**
* @brief HardwareBreakpoints::setCPUReadWriteBP
* @param index
* @param inUse
*/
void HardwareBreakpoints::setCPUReadWriteBP(int index, bool inUse) {
const edb::address_t address = edb::v1::cpu_selected_address();
constexpr size_t Size = 1;
setWriteBP(index, inUse, address, Size);
}
/**
* @brief HardwareBreakpoints::setCPUWriteBP
* @param index
* @param inUse
*/
void HardwareBreakpoints::setCPUWriteBP(int index, bool inUse) {
const edb::address_t address = edb::v1::cpu_selected_address();
constexpr size_t Size = 1;
setWriteBP(index, inUse, address, Size);
}
/**
* @brief HardwareBreakpoints::setExec1
*/
void HardwareBreakpoints::setExec1() {
setExec(Register1);
}
/**
* @brief HardwareBreakpoints::setExec2
*/
void HardwareBreakpoints::setExec2() {
setExec(Register2);
}
/**
* @brief HardwareBreakpoints::setExec3
*/
void HardwareBreakpoints::setExec3() {
setExec(Register3);
}
/**
* @brief HardwareBreakpoints::setExec4
*/
void HardwareBreakpoints::setExec4() {
setExec(Register4);
}
/**
* @brief HardwareBreakpoints::setAccess1
*/
void HardwareBreakpoints::setAccess1() {
setAccess(Register1);
}
/**
* @brief HardwareBreakpoints::setAccess2
*/
void HardwareBreakpoints::setAccess2() {
setAccess(Register2);
}
/**
* @brief HardwareBreakpoints::setAccess3
*/
void HardwareBreakpoints::setAccess3() {
setAccess(Register3);
}
/**
* @brief HardwareBreakpoints::setAccess4
*/
void HardwareBreakpoints::setAccess4() {
setAccess(Register4);
}
/**
* @brief HardwareBreakpoints::setWrite1
*/
void HardwareBreakpoints::setWrite1() {
setWrite(Register1);
}
/**
* @brief HardwareBreakpoints::setWrite2
*/
void HardwareBreakpoints::setWrite2() {
setWrite(Register2);
}
/**
* @brief HardwareBreakpoints::setWrite3
*/
void HardwareBreakpoints::setWrite3() {
setWrite(Register3);
}
/**
* @brief HardwareBreakpoints::setWrite4
*/
void HardwareBreakpoints::setWrite4() {
setWrite(Register4);
}
}
edb-debugger/plugins/HardwareBreakpoints/DialogHwBreakpoints.h 0000644 0001750 0001750 00000002574 13765535463 024432 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_HW_BREAKPOINTS_H_20080228_
#define DIALOG_HW_BREAKPOINTS_H_20080228_
#include "ui_DialogHwBreakpoints.h"
#include
namespace HardwareBreakpointsPlugin {
class DialogHwBreakpoints : public QDialog {
Q_OBJECT
private:
friend class HardwareBreakpoints;
public:
explicit DialogHwBreakpoints(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogHwBreakpoints() override = default;
private:
void showEvent(QShowEvent *event) override;
private Q_SLOTS:
void type1IndexChanged(int index);
void type2IndexChanged(int index);
void type3IndexChanged(int index);
void type4IndexChanged(int index);
private:
Ui::DialogHwBreakpoints ui;
};
}
#endif
edb-debugger/plugins/HardwareBreakpoints/CMakeLists.txt 0000644 0001750 0001750 00000001650 13765535463 023113 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
include("GNUInstallDirs")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(PluginName "HardwareBreakpoints")
find_package(Qt5 5.0.0 REQUIRED Widgets)
add_library(${PluginName} SHARED
DialogHwBreakpoints.cpp
DialogHwBreakpoints.h
DialogHwBreakpoints.ui
HardwareBreakpoints.cpp
HardwareBreakpoints.h
libHardwareBreakpoints.cpp
libHardwareBreakpoints.h
)
target_link_libraries(${PluginName} Qt5::Widgets edb)
install (TARGETS ${PluginName} DESTINATION ${CMAKE_INSTALL_LIBDIR}/edb)
set_property(TARGET ${PluginName} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD 14)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${PluginName} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set_property(TARGET ${PluginName} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
edb-debugger/plugins/HardwareBreakpoints/HardwareBreakpoints.h 0000644 0001750 0001750 00000005335 13765535463 024467 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef HARDWARE_BREAKPOINTS_H_20080228_
#define HARDWARE_BREAKPOINTS_H_20080228_
#include "IDebugEventHandler.h"
#include "IPlugin.h"
#include "libHardwareBreakpoints.h"
class QDialog;
class QMenu;
class State;
class QCheckBox;
class QComboBox;
class QLineEdit;
namespace HardwareBreakpointsPlugin {
class HardwareBreakpoints : public QObject, public IPlugin, public IDebugEventHandler {
Q_OBJECT
Q_INTERFACES(IPlugin)
Q_PLUGIN_METADATA(IID "edb.IPlugin/1.0")
Q_CLASSINFO("author", "Evan Teran")
Q_CLASSINFO("url", "http://www.codef00.com")
public:
HardwareBreakpoints(QObject *parent = nullptr);
protected:
void privateInit() override;
void privateFini() override;
public:
QMenu *menu(QWidget *parent = nullptr) override;
edb::EventStatus handleEvent(const std::shared_ptr &event) override;
QList cpuContextMenu() override;
QList stackContextMenu() override;
QList dataContextMenu() override;
public Q_SLOTS:
void showMenu();
private:
void setupBreakpoints();
void setExecuteBP(int index, bool inUse);
void setReadWriteBP(int index, bool inUse, edb::address_t address, size_t size);
void setWriteBP(int index, bool inUse, edb::address_t address, size_t size);
void setDataReadWriteBP(int index, bool inUse);
void setDataWriteBP(int index, bool inUse);
void setStackReadWriteBP(int index, bool inUse);
void setStackWriteBP(int index, bool inUse);
void setCPUReadWriteBP(int index, bool inUse);
void setCPUWriteBP(int index, bool inUse);
void setExec(int index);
void setWrite(int index);
void setAccess(int index);
private Q_SLOTS:
void setWrite1();
void setWrite2();
void setWrite3();
void setWrite4();
void setAccess1();
void setAccess2();
void setAccess3();
void setAccess4();
void setExec1();
void setExec2();
void setExec3();
void setExec4();
private:
QMenu *menu_ = nullptr;
QPointer dialog_ = nullptr;
QLineEdit *addresses_[4] = {};
QCheckBox *enabled_[4] = {};
QComboBox *types_[4] = {};
QComboBox *sizes_[4] = {};
};
}
#endif
edb-debugger/plugins/HardwareBreakpoints/libHardwareBreakpoints.h 0000644 0001750 0001750 00000002566 13765535463 025161 0 ustar eteran eteran /*
Copyright (C) 2015 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef LIB_HARDWARE_BREAKPOINTS_H_20191119_
#define LIB_HARDWARE_BREAKPOINTS_H_20191119_
#include "edb.h"
namespace HardwareBreakpointsPlugin {
constexpr int Register1 = 0;
constexpr int Register2 = 1;
constexpr int Register3 = 2;
constexpr int Register4 = 3;
constexpr int RegisterCount = 4;
struct BreakpointState {
bool enabled;
edb::address_t addr;
int type;
int size;
};
enum BreakpointStatus {
Valid,
AlignmentError,
SizeError
};
BreakpointState breakpoint_state(const State *state, int num);
void set_breakpoint_state(State *state, int num, const BreakpointState &bp_state);
BreakpointStatus validate_breakpoint(const BreakpointState &bp_state);
}
#endif
edb-debugger/plugins/HardwareBreakpoints/libHardwareBreakpoints.cpp 0000644 0001750 0001750 00000010271 13765535463 025504 0 ustar eteran eteran /*
Copyright (C) 2015 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "libHardwareBreakpoints.h"
#include "State.h"
namespace HardwareBreakpointsPlugin {
/**
* @brief validate_breakpoint
* @param bp_state
* @return
*/
BreakpointStatus validate_breakpoint(const BreakpointState &bp_state) {
if (bp_state.enabled) {
switch (bp_state.type) {
case 2:
case 1: {
const edb::address_t address_mask = (1u << bp_state.size) - 1;
if ((bp_state.addr & address_mask) != 0) {
return AlignmentError;
}
} break;
default:
break;
}
if (edb::v1::debuggeeIs32Bit()) {
if (bp_state.size == 3) {
return SizeError;
}
}
}
return Valid;
}
/**
* @brief breakpoint_state
* @param state
* @param num
* @return
*/
BreakpointState breakpoint_state(const State *state, int num) {
Q_ASSERT(num < RegisterCount);
const int N1 = 16 + (num * 4);
const int N2 = 18 + (num * 4);
BreakpointState bp_state;
// enabled
switch (num) {
case Register1:
bp_state.enabled = (state->debugRegister(7) & 0x00000001) != 0;
break;
case Register2:
bp_state.enabled = (state->debugRegister(7) & 0x00000004) != 0;
break;
case Register3:
bp_state.enabled = (state->debugRegister(7) & 0x00000010) != 0;
break;
case Register4:
bp_state.enabled = (state->debugRegister(7) & 0x00000040) != 0;
break;
}
// address
bp_state.addr = state->debugRegister(num);
// type
switch ((state->debugRegister(7) >> N1) & 0x03) {
case 0x00:
bp_state.type = 0;
break;
case 0x01:
bp_state.type = 1;
break;
case 0x03:
bp_state.type = 2;
break;
default:
bp_state.type = -1;
Q_ASSERT(0 && "Internal Error");
}
// size
switch ((state->debugRegister(7) >> N2) & 0x03) {
case 0x00:
bp_state.size = 0;
break;
case 0x01:
bp_state.size = 1;
break;
case 0x03:
bp_state.size = 2;
break;
case 0x02:
bp_state.size = 3;
}
return bp_state;
}
/**
* @brief set_breakpoint_state
* @param state
* @param num
* @param bp_state
*/
void set_breakpoint_state(State *state, int num, const BreakpointState &bp_state) {
const int N1 = 16 + (num * 4);
const int N2 = 18 + (num * 4);
// default to disabled
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x01ULL << (num * 2))));
if (bp_state.enabled) {
// set the address
state->setDebugRegister(num, bp_state.addr);
// enable this breakpoint
state->setDebugRegister(7, state->debugRegister(7) | (0x01ULL << (num * 2)));
// setup the type
switch (bp_state.type) {
case 2:
// read/write
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x03ULL << N1)) | (0x03ULL << N1));
break;
case 1:
// write
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x03ULL << N1)) | (0x01ULL << N1));
break;
case 0:
// execute
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x03ULL << N1)) | (0x00ULL << N1));
break;
}
if (bp_state.type != 0) {
// setup the size
switch (bp_state.size) {
case 3:
// 8 bytes
Q_ASSERT(edb::v1::debuggeeIs64Bit());
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x03ULL << N2)) | (0x02ULL << N2));
break;
case 2:
// 4 bytes
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x03ULL << N2)) | (0x03ULL << N2));
break;
case 1:
// 2 bytes
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x03ULL << N2)) | (0x01ULL << N2));
break;
case 0:
// 1 byte
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x03ULL << N2)) | (0x00ULL << N2));
break;
}
} else {
state->setDebugRegister(7, (state->debugRegister(7) & ~(0x03ULL << N2)));
}
}
}
}
edb-debugger/plugins/HardwareBreakpoints/DialogHwBreakpoints.ui 0000644 0001750 0001750 00000020661 13765535463 024615 0 ustar eteran eteran
Evan Teran
HardwareBreakpointsPlugin::DialogHwBreakpoints
0
0
461
222
Hardware Breakpoints
-
Address
-
Type
-
Size
-
BP 1
-
Monospace
-
-
Execute
-
Write
-
Read/Write
-
false
-
1 Byte
-
2 Bytes
-
4 Bytes
-
8 Bytes
-
Enabled
-
BP 2
-
Monospace
-
-
Execute
-
Write
-
Read/Write
-
false
-
1 Byte
-
2 Bytes
-
4 Bytes
-
8 Bytes
-
Enabled
-
BP 3
-
Monospace
-
-
Execute
-
Write
-
Read/Write
-
false
-
1 Byte
-
2 Bytes
-
4 Bytes
-
8 Bytes
-
Enabled
-
BP 4
-
Monospace
-
-
Execute
-
Write
-
Read/Write
-
false
-
1 Byte
-
2 Bytes
-
4 Bytes
-
8 Bytes
-
Enabled
-
Qt::Vertical
20
40
-
Qt::Horizontal
QDialogButtonBox::Cancel|QDialogButtonBox::Ok
buttonBox
accepted()
HardwareBreakpointsPlugin::DialogHwBreakpoints
accept()
262
199
89
191
buttonBox
rejected()
HardwareBreakpointsPlugin::DialogHwBreakpoints
reject()
401
201
18
189
edb-debugger/plugins/CMakeLists.txt 0000644 0001750 0001750 00000001514 13765535463 017153 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
add_definitions(-DQT_PLUGIN)
add_subdirectory(DebuggerCore)
add_subdirectory(Analyzer)
add_subdirectory(Assembler)
add_subdirectory(BinaryInfo)
add_subdirectory(Bookmarks)
add_subdirectory(BreakpointManager)
add_subdirectory(CheckVersion)
add_subdirectory(OpcodeSearcher)
add_subdirectory(ProcessProperties)
add_subdirectory(ROPTool)
add_subdirectory(References)
add_subdirectory(SymbolViewer)
add_subdirectory(Backtrace)
add_subdirectory(DumpState)
add_subdirectory(FunctionFinder)
add_subdirectory(DebuggerErrorConsole)
add_subdirectory(BinarySearcher)
add_subdirectory(InstructionInspector)
add_subdirectory(FasLoader)
add_subdirectory(ODbgRegisterView)
if(TARGET_ARCH_FAMILY_X86)
add_subdirectory(HardwareBreakpoints)
endif()
if(TARGET_PLATFORM_LINUX)
add_subdirectory(HeapAnalyzer)
endif()
edb-debugger/plugins/BinarySearcher/ 0000755 0001750 0001750 00000000000 13765535463 017313 5 ustar eteran eteran edb-debugger/plugins/BinarySearcher/DialogResults.cpp 0000644 0001750 0001750 00000002434 13765535463 022603 0 ustar eteran eteran
#include "DialogResults.h"
#include "edb.h"
namespace BinarySearcherPlugin {
/**
* @brief DialogResults::DialogResults
* @param parent
* @param f
*/
DialogResults::DialogResults(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
}
/**
* follows the found item in the appropriate view
*
* @brief DialogResults::on_listWidget_itemDoubleClicked
* @param item
*/
void DialogResults::on_listWidget_itemDoubleClicked(QListWidgetItem *item) {
const edb::address_t addr = item->data(Qt::UserRole).toULongLong();
switch (static_cast(item->data(Qt::UserRole + 1).toInt())) {
case RegionType::Code:
edb::v1::jump_to_address(addr);
break;
case RegionType::Stack:
edb::v1::dump_stack(addr, true);
break;
case RegionType::Data:
edb::v1::dump_data(addr);
break;
}
}
/**
* @brief DialogResults::addResult
* @param address
*/
void DialogResults::addResult(RegionType region, edb::address_t address) {
auto item = new QListWidgetItem(edb::v1::format_pointer(address));
item->setData(Qt::UserRole, address.toQVariant());
item->setData(Qt::UserRole + 1, static_cast(region));
ui.listWidget->addItem(item);
}
/**
* @brief DialogResults::resultCount
* @return
*/
int DialogResults::resultCount() const {
return ui.listWidget->count();
}
}
edb-debugger/plugins/BinarySearcher/BinarySearcher.h 0000644 0001750 0001750 00000002562 13765535463 022372 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef BINARY_SEARCHER_H_20060430_
#define BINARY_SEARCHER_H_20060430_
#include "IPlugin.h"
class QMenu;
class QDialog;
namespace BinarySearcherPlugin {
class BinarySearcher : public QObject, public IPlugin {
Q_OBJECT
Q_INTERFACES(IPlugin)
Q_PLUGIN_METADATA(IID "edb.IPlugin/1.0")
Q_CLASSINFO("author", "Evan Teran")
Q_CLASSINFO("url", "http://www.codef00.com")
public:
explicit BinarySearcher(QObject *parent = nullptr);
~BinarySearcher() override = default;
public:
QMenu *menu(QWidget *parent = nullptr) override;
QList stackContextMenu() override;
public Q_SLOTS:
void showMenu();
void mnuStackFindAscii();
private:
QMenu *menu_ = nullptr;
};
}
#endif
edb-debugger/plugins/BinarySearcher/DialogAsciiString.ui 0000644 0001750 0001750 00000004500 13765535463 023210 0 ustar eteran eteran
BinarySearcherPlugin::DialogAsciiString
0
0
391
142
Find ASCII String
-
ASCII String
-
true
-
false
Case Sensitive
true
-
QDialogButtonBox::Close
-
txtAscii
chkCaseSensitive
buttonBox
accepted()
BinarySearcherPlugin::DialogAsciiString
accept()
174
83
285
56
buttonBox
rejected()
BinarySearcherPlugin::DialogAsciiString
reject()
133
88
326
99
edb-debugger/plugins/BinarySearcher/DialogAsciiString.cpp 0000644 0001750 0001750 00000007160 13765535463 023362 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "DialogAsciiString.h"
#include "DialogResults.h"
#include "IDebugger.h"
#include "IProcess.h"
#include "IRegion.h"
#include "IThread.h"
#include "MemoryRegions.h"
#include "State.h"
#include "edb.h"
#include "util/Math.h"
#include
#include
#include
#include
#include
#include
namespace BinarySearcherPlugin {
/**
* @brief DialogAsciiString::DialogAsciiString
* @param parent
* @param f
*/
DialogAsciiString::DialogAsciiString(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
ui.progressBar->setValue(0);
buttonFind_ = new QPushButton(QIcon::fromTheme("edit-find"), tr("Find"));
connect(buttonFind_, &QPushButton::clicked, this, [this]() {
buttonFind_->setEnabled(false);
ui.progressBar->setValue(0);
doFind();
ui.progressBar->setValue(100);
buttonFind_->setEnabled(true);
});
ui.buttonBox->addButton(buttonFind_, QDialogButtonBox::ActionRole);
}
/**
* @brief DialogAsciiString::doFind
*
* find *stack aligned pointers* to exact string matches
*/
void DialogAsciiString::doFind() {
const QByteArray b = ui.txtAscii->text().toLatin1();
auto results = new DialogResults(this);
const auto sz = static_cast(b.size());
if (sz != 0) {
edb::v1::memory_regions().sync();
if (IProcess *process = edb::v1::debugger_core->process()) {
if (std::shared_ptr thread = process->currentThread()) {
State state;
thread->getState(&state);
edb::address_t stack_ptr = state.stackPointer();
if (std::shared_ptr region = edb::v1::memory_regions().findRegion(stack_ptr)) {
edb::address_t count = (region->end() - stack_ptr) / edb::v1::pointer_size();
stack_ptr = region->start();
try {
std::vector chars(sz);
int i = 0;
while (stack_ptr < region->end()) {
// get the value from the stack
edb::address_t stack_address;
if (process->readBytes(stack_ptr, &stack_address, edb::v1::pointer_size())) {
if (process->readBytes(stack_address, &chars[0], chars.size())) {
if (std::memcmp(&chars[0], b.constData(), chars.size()) == 0) {
results->addResult(DialogResults::RegionType::Stack, stack_ptr);
}
}
}
ui.progressBar->setValue(util::percentage(i++, count));
stack_ptr += edb::v1::pointer_size();
}
} catch (const std::bad_alloc &) {
QMessageBox::critical(
nullptr,
tr("Memroy Allocation Error"),
tr("Unable to satisfy memory allocation request for search string."));
}
}
}
}
}
if (results->resultCount() == 0) {
QMessageBox::information(nullptr, tr("No Results"), tr("No Results were found!"));
delete results;
} else {
results->show();
}
}
/**
* @brief DialogAsciiString::showEvent
* @param event
*/
void DialogAsciiString::showEvent(QShowEvent *event) {
Q_UNUSED(event)
ui.txtAscii->setFocus();
}
}
edb-debugger/plugins/BinarySearcher/CMakeLists.txt 0000644 0001750 0001750 00000001731 13765535463 022055 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
include("GNUInstallDirs")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(PluginName "BinarySearcher")
find_package(Qt5 5.0.0 REQUIRED Widgets)
add_library(${PluginName} SHARED
BinarySearcher.cpp
BinarySearcher.h
DialogAsciiString.cpp
DialogAsciiString.h
DialogAsciiString.ui
DialogBinaryString.cpp
DialogBinaryString.h
DialogBinaryString.ui
DialogResults.cpp
DialogResults.h
DialogResults.ui
)
target_link_libraries(${PluginName} Qt5::Widgets edb)
install (TARGETS ${PluginName} DESTINATION ${CMAKE_INSTALL_LIBDIR}/edb)
set_property(TARGET ${PluginName} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD 14)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${PluginName} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set_property(TARGET ${PluginName} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
edb-debugger/plugins/BinarySearcher/DialogAsciiString.h 0000644 0001750 0001750 00000002363 13765535463 023027 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_ASCII_STRING_H_20082201_
#define DIALOG_ASCII_STRING_H_20082201_
#include "ui_DialogAsciiString.h"
#include
class QListWidgetItem;
namespace BinarySearcherPlugin {
class DialogAsciiString : public QDialog {
Q_OBJECT
public:
explicit DialogAsciiString(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogAsciiString() override = default;
protected:
void showEvent(QShowEvent *event) override;
private:
void doFind();
private:
Ui::DialogAsciiString ui;
QPushButton *buttonFind_ = nullptr;
};
}
#endif
edb-debugger/plugins/BinarySearcher/DialogResults.h 0000644 0001750 0001750 00000002504 13765535463 022246 0 ustar eteran eteran /*
Copyright (C) 2006 - 2019 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_RESULTS_H_20190403_
#define DIALOG_RESULTS_H_20190403_
#include "edb.h"
#include "ui_DialogResults.h"
#include
class QListWidgetItem;
namespace BinarySearcherPlugin {
class DialogResults : public QDialog {
Q_OBJECT
public:
enum class RegionType {
Code,
Stack,
Data
};
public:
explicit DialogResults(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogResults() override = default;
public:
void addResult(RegionType region, edb::address_t address);
int resultCount() const;
public Q_SLOTS:
void on_listWidget_itemDoubleClicked(QListWidgetItem *);
private:
Ui::DialogResults ui;
};
}
#endif
edb-debugger/plugins/BinarySearcher/DialogResults.ui 0000644 0001750 0001750 00000003365 13765535463 022442 0 ustar eteran eteran
BinarySearcherPlugin::DialogResults
0
0
581
254
Search Results
-
Monospace
true
-
Qt::Horizontal
QDialogButtonBox::Close
buttonBox
accepted()
BinarySearcherPlugin::DialogResults
accept()
224
317
157
274
buttonBox
rejected()
BinarySearcherPlugin::DialogResults
reject()
292
323
286
274
edb-debugger/plugins/BinarySearcher/BinarySearcher.cpp 0000644 0001750 0001750 00000003725 13765535463 022727 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "BinarySearcher.h"
#include "DialogAsciiString.h"
#include "DialogBinaryString.h"
#include "edb.h"
#include
namespace BinarySearcherPlugin {
/**
* @brief BinarySearcher::BinarySearcher
* @param parent
*/
BinarySearcher::BinarySearcher(QObject *parent)
: QObject(parent) {
}
/**
* @brief BinarySearcher::menu
* @param parent
* @return
*/
QMenu *BinarySearcher::menu(QWidget *parent) {
Q_ASSERT(parent);
if (!menu_) {
menu_ = new QMenu(tr("BinarySearcher"), parent);
menu_->addAction(tr("&Binary String Search"), this, SLOT(showMenu()), QKeySequence(tr("Ctrl+F")));
}
return menu_;
}
/**
* @brief BinarySearcher::stackContextMenu
* @return
*/
QList BinarySearcher::stackContextMenu() {
QList ret;
auto action_find = new QAction(tr("&Find ASCII String"), this);
connect(action_find, &QAction::triggered, this, &BinarySearcher::mnuStackFindAscii);
ret << action_find;
return ret;
}
/**
* @brief BinarySearcher::showMenu
*/
void BinarySearcher::showMenu() {
static auto dialog = new DialogBinaryString(edb::v1::debugger_ui);
dialog->show();
}
/**
* @brief BinarySearcher::mnuStackFindAscii
*/
void BinarySearcher::mnuStackFindAscii() {
static auto dialog = new DialogAsciiString(edb::v1::debugger_ui);
dialog->show();
}
}
edb-debugger/plugins/BinarySearcher/DialogBinaryString.h 0000644 0001750 0001750 00000002301 13765535463 023213 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_BINARY_STRING_H_20061101_
#define DIALOG_BINARY_STRING_H_20061101_
#include "ui_DialogBinaryString.h"
#include
class QListWidgetItem;
namespace BinarySearcherPlugin {
class DialogBinaryString : public QDialog {
Q_OBJECT
public:
explicit DialogBinaryString(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogBinaryString() override = default;
private:
void doFind();
private:
Ui::DialogBinaryString ui;
QPushButton *buttonFind_ = nullptr;
};
}
#endif
edb-debugger/plugins/BinarySearcher/DialogBinaryString.cpp 0000644 0001750 0001750 00000006706 13765535463 023563 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "DialogBinaryString.h"
#include "DialogResults.h"
#include "IDebugger.h"
#include "IRegion.h"
#include "MemoryRegions.h"
#include "edb.h"
#include "util/Math.h"
#include
#include
#include
#include
#include
namespace BinarySearcherPlugin {
/**
* @brief DialogBinaryString::DialogBinaryString
* @param parent
* @param f
*/
DialogBinaryString::DialogBinaryString(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
ui.progressBar->setValue(0);
// NOTE(eteran): address issue #574
ui.binaryString->setShowKeepSize(false);
buttonFind_ = new QPushButton(QIcon::fromTheme("edit-find"), tr("Find"));
connect(buttonFind_, &QPushButton::clicked, this, [this]() {
buttonFind_->setEnabled(false);
ui.progressBar->setValue(0);
doFind();
ui.progressBar->setValue(100);
buttonFind_->setEnabled(true);
});
ui.buttonBox->addButton(buttonFind_, QDialogButtonBox::ActionRole);
}
/**
* @brief DialogBinaryString::doFind
*/
void DialogBinaryString::doFind() {
const QByteArray b = ui.binaryString->value();
auto results = new DialogResults(this);
const int sz = b.size();
if (sz != 0) {
edb::v1::memory_regions().sync();
const QList> regions = edb::v1::memory_regions().regions();
const size_t page_size = edb::v1::debugger_core->pageSize();
int i = 0;
for (const std::shared_ptr ®ion : regions) {
const size_t region_size = region->size();
// a short circut for speading things up
if (ui.chkSkipNoAccess->isChecked() && !region->accessible()) {
ui.progressBar->setValue(util::percentage(++i, regions.size()));
continue;
}
const size_t page_count = region_size / page_size;
const QVector pages = edb::v1::read_pages(region->start(), page_count);
if (!pages.isEmpty()) {
const uint8_t *p = &pages[0];
const uint8_t *const pages_end = &pages[0] + region_size - sz;
while (p < pages_end) {
// compare values..
if (std::memcmp(p, b.constData(), sz) == 0) {
const edb::address_t addr = p - &pages[0] + region->start();
const edb::address_t align = 1 << (ui.cmbAlignment->currentIndex() + 1);
if (!ui.chkAlignment->isChecked() || (addr % align) == 0) {
results->addResult(DialogResults::RegionType::Data, addr);
}
}
// update progress bar every 64KB
if ((uint64_t(p) & 0xFFFF) == 0) {
ui.progressBar->setValue(util::percentage(i, regions.size(), p - &pages[0], region_size));
}
++p;
}
}
++i;
}
if (results->resultCount() == 0) {
QMessageBox::information(nullptr, tr("No Results"), tr("No Results were found!"));
delete results;
} else {
results->show();
}
}
}
}
edb-debugger/plugins/BinarySearcher/DialogBinaryString.ui 0000644 0001750 0001750 00000006763 13765535463 023421 0 ustar eteran eteran
Evan Teran
BinarySearcherPlugin::DialogBinaryString
0
0
480
185
Binary String
-
0
0
-
Skip Regions With No Access Rights
-
false
Case Sensitive
true
-
Show Results With This Address Alignment
-
1
-
2 Byte Alignment
-
4 Byte Alignment
-
8 Byte Alignment
-
QDialogButtonBox::Close
-
BinaryString
QFrame
1
chkSkipNoAccess
chkCaseSensitive
chkAlignment
cmbAlignment
buttonBox
accepted()
BinarySearcherPlugin::DialogBinaryString
accept()
417
130
458
153
buttonBox
rejected()
BinarySearcherPlugin::DialogBinaryString
reject()
443
126
329
150
edb-debugger/plugins/BreakpointManager/ 0000755 0001750 0001750 00000000000 13765535463 020003 5 ustar eteran eteran edb-debugger/plugins/BreakpointManager/DialogBreakpoints.cpp 0000644 0001750 0001750 00000022512 13765535463 024112 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "DialogBreakpoints.h"
#include "Expression.h"
#include "IBreakpoint.h"
#include "IDebugger.h"
#include "MemoryRegions.h"
#include "edb.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace BreakpointManagerPlugin {
/**
* @brief DialogBreakpoints::DialogBreakpoints
* @param parent
* @param f
*/
DialogBreakpoints::DialogBreakpoints(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent, f) {
ui.setupUi(this);
ui.tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
}
/**
* @brief DialogBreakpoints::showEvent
*/
void DialogBreakpoints::showEvent(QShowEvent *) {
connect(edb::v1::disassembly_widget(), SIGNAL(signalUpdated()), this, SLOT(updateList()));
updateList();
}
/**
* @brief DialogBreakpoints::hideEvent
*/
void DialogBreakpoints::hideEvent(QHideEvent *) {
disconnect(edb::v1::disassembly_widget(), SIGNAL(signalUpdated()), this, SLOT(updateList()));
}
/**
* @brief DialogBreakpoints::updateList
*/
void DialogBreakpoints::updateList() {
ui.tableWidget->setSortingEnabled(false);
ui.tableWidget->setRowCount(0);
const IDebugger::BreakpointList breakpoint_state = edb::v1::debugger_core->backupBreakpoints();
for (const std::shared_ptr &bp : breakpoint_state) {
//Skip if it's an internal bp; we don't want to insert a row for it.
if (bp->internal()) {
continue;
}
const int row = ui.tableWidget->rowCount();
ui.tableWidget->insertRow(row);
const edb::address_t address = bp->address();
const QString condition = bp->condition;
const bool onetime = bp->oneTime();
const QString symname = edb::v1::find_function_symbol(address, QString(), nullptr);
const QString bytes = edb::v1::format_bytes(bp->originalBytes(), bp->size());
auto item = new QTableWidgetItem(edb::v1::format_pointer(address));
item->setData(Qt::UserRole, address.toQVariant());
ui.tableWidget->setItem(row, 0, item);
ui.tableWidget->setItem(row, 1, new QTableWidgetItem(condition));
ui.tableWidget->setItem(row, 2, new QTableWidgetItem(bytes));
ui.tableWidget->setItem(row, 3, new QTableWidgetItem(onetime ? tr("One Time") : tr("Standard")));
ui.tableWidget->setItem(row, 4, new QTableWidgetItem(symname));
}
ui.tableWidget->setSortingEnabled(true);
}
/**
* @brief DialogBreakpoints::on_btnAdd_clicked
*/
void DialogBreakpoints::on_btnAdd_clicked() {
bool ok;
QString text = QInputDialog::getText(this, tr("Add Breakpoint"), tr("Address:"), QLineEdit::Normal, QString(), &ok);
if (ok && !text.isEmpty()) {
Expression expr(text, edb::v1::get_variable, edb::v1::get_value);
const Result address = expr.evaluate();
if (address) {
edb::v1::create_breakpoint(*address);
updateList();
} else {
QMessageBox::critical(this, tr("Error In Address Expression!"), address.error().what());
}
}
}
/**
* @brief DialogBreakpoints::on_btnCondition_clicked
*/
void DialogBreakpoints::on_btnCondition_clicked() {
QList sel = ui.tableWidget->selectedItems();
if (!sel.empty()) {
QTableWidgetItem *const item = sel[0];
bool ok;
const edb::address_t address = item->data(Qt::UserRole).toULongLong();
const QString condition = edb::v1::get_breakpoint_condition(address);
const QString text = QInputDialog::getText(this, tr("Set Breakpoint Condition"), tr("Expression:"), QLineEdit::Normal, condition, &ok);
if (ok) {
edb::v1::set_breakpoint_condition(address, text);
updateList();
}
}
}
/**
* @brief DialogBreakpoints::on_btnRemove_clicked
*/
void DialogBreakpoints::on_btnRemove_clicked() {
QList sel = ui.tableWidget->selectedItems();
if (!sel.empty()) {
QTableWidgetItem *const item = sel[0];
const edb::address_t address = item->data(Qt::UserRole).toULongLong();
edb::v1::remove_breakpoint(address);
}
updateList();
}
/**
* @brief DialogBreakpoints::on_tableWidget_cellDoubleClicked
* @param row
* @param col
*/
void DialogBreakpoints::on_tableWidget_cellDoubleClicked(int row, int col) {
switch (col) {
case 0: // address
if (QTableWidgetItem *const address_item = ui.tableWidget->item(row, 0)) {
const edb::address_t address = address_item->data(Qt::UserRole).toULongLong();
edb::v1::jump_to_address(address);
}
break;
case 1: // condition
if (QTableWidgetItem *const address_item = ui.tableWidget->item(row, 0)) {
bool ok;
const edb::address_t address = address_item->data(Qt::UserRole).toULongLong();
const QString condition = edb::v1::get_breakpoint_condition(address);
const QString text = QInputDialog::getText(this, tr("Set Breakpoint Condition"), tr("Expression:"), QLineEdit::Normal, condition, &ok);
if (ok) {
edb::v1::set_breakpoint_condition(address, text);
updateList();
}
}
break;
}
}
/**
* @brief DialogBreakpoints::on_btnImport_clicked
*
* Opens a file selection window to choose a file with newline-separated,
* hex address breakpoints.
*/
void DialogBreakpoints::on_btnImport_clicked() {
// Let the user choose the file; get the file name.
QString home_directory = QDir::homePath();
QString file_name = QFileDialog::getOpenFileName(this, tr("Breakpoint Import File"), home_directory, nullptr);
if (file_name.isEmpty()) {
return;
}
// Open the file; fail if error or it doesn't exist.
QFile file(file_name);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::critical(this, tr("Error Opening File"), tr("Unable to open breakpoint file: %1").arg(file_name));
return;
}
// Keep a list of any lines in the file that don't make valid breakpoints.
QStringList errors;
// Iterate through each line; attempt to make a breakpoint for each line.
// Addreses should be prefixed with 0x, i.e. a hex number.
// Count each breakpoint successfully made.
int count = 0;
Q_FOREVER {
// Get the address
QString line = file.readLine().trimmed();
if (line.isEmpty()) {
break;
}
bool ok;
int base = 16;
edb::address_t address = line.toULong(&ok, base);
// Skip if there's an issue.
if (!ok) {
errors.append(line);
continue;
}
// If there's an issue with the line or address isn't in any region,
// add to error list and skip.
edb::v1::memory_regions().sync();
std::shared_ptr p = edb::v1::memory_regions().findRegion(address);
if (!p) {
errors.append(line);
continue;
}
// If the bp already exists, skip. No error.
if (edb::v1::debugger_core->findBreakpoint(address)) {
continue;
}
// If the line was converted to an address, try to create the breakpoint.
// Access debugger_core directly to avoid many possible error windows by edb::v1::create_breakpoint()
if (const std::shared_ptr bp = edb::v1::debugger_core->addBreakpoint(address)) {
count++;
} else {
errors.append(line);
}
}
// Report any errors to the user
if (errors.size() > 0) {
QMessageBox::warning(this, tr("Invalid Breakpoints"), tr("The following breakpoints were not made:\n%1").arg(errors.join("")));
}
// Report breakpoints successfully made
QMessageBox::information(this, tr("Breakpoint Import"), tr("Imported %1 breakpoints.").arg(count));
updateList();
}
/**
* @brief DialogBreakpoints::on_btnExport_clicked
*
* Opens a file selection window to choose a file to save newline-separated,
* hex address breakpoints.
*/
void DialogBreakpoints::on_btnExport_clicked() {
//Get the current list of breakpoints
const IDebugger::BreakpointList breakpoint_state = edb::v1::debugger_core->backupBreakpoints();
//Create a list for addresses to be exported at the end
QList export_list;
//Go through our breakpoints and add for export if not one-time and not internal.
for (const std::shared_ptr &bp : breakpoint_state) {
if (!bp->oneTime() && !bp->internal()) {
export_list.append(bp->address());
}
}
//If there are no breakpoints, fail
if (export_list.isEmpty()) {
QMessageBox::critical(this, tr("No Breakpoints"), tr("There are no breakpoints to export."));
return;
}
//Now ask the user for a file, open it, and write each address to it.
QString filename = QFileDialog::getSaveFileName(this, tr("Breakpoint Export File"), QDir::homePath());
if (filename.isEmpty()) {
return;
}
QFile file(filename);
if (!file.open(QIODevice::WriteOnly)) {
return;
}
for (edb::address_t address : export_list) {
QString string_address = "0x" + QString::number(address, 16) + "\n";
file.write(string_address.toLatin1());
}
QMessageBox::information(this, tr("Breakpoint Export"), tr("Exported %1 breakpoints").arg(export_list.size()));
}
}
edb-debugger/plugins/BreakpointManager/CMakeLists.txt 0000644 0001750 0001750 00000001546 13765535463 022551 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
include("GNUInstallDirs")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(PluginName "BreakpointManager")
find_package(Qt5 5.0.0 REQUIRED Widgets)
add_library(${PluginName} SHARED
BreakpointManager.cpp
BreakpointManager.h
DialogBreakpoints.cpp
DialogBreakpoints.h
DialogBreakpoints.ui
)
target_link_libraries(${PluginName} Qt5::Widgets edb)
install (TARGETS ${PluginName} DESTINATION ${CMAKE_INSTALL_LIBDIR}/edb)
set_property(TARGET ${PluginName} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD 14)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${PluginName} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set_property(TARGET ${PluginName} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
edb-debugger/plugins/BreakpointManager/DialogBreakpoints.ui 0000644 0001750 0001750 00000011761 13765535463 023751 0 ustar eteran eteran
Evan Teran
BreakpointManagerPlugin::DialogBreakpoints
0
0
853
252
Breakpoint Manager
-
&Import Breakpoints
..
-
Set Breakpoint &Condition
..
-
Qt::Vertical
20
40
-
&Close
..
true
-
&Remove Breakpoint
..
-
&Add Breakpoint
..
-
QAbstractItemView::NoEditTriggers
true
QAbstractItemView::SingleSelection
QAbstractItemView::SelectRows
false
true
false
Address
Condition
Original Byte
Type
Function
-
Qt::Vertical
20
40
-
&Export Breakpoints
..
tableWidget
btnAdd
btnRemove
btnCondition
okButton
okButton
clicked()
BreakpointManagerPlugin::DialogBreakpoints
accept()
702
242
660
212
on_btnImport_clicked()
on_btnExport_clicked()
edb-debugger/plugins/BreakpointManager/DialogBreakpoints.h 0000644 0001750 0001750 00000002675 13765535463 023567 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef DIALOG_BREAKPOINTS_H_20061101_
#define DIALOG_BREAKPOINTS_H_20061101_
#include "ui_DialogBreakpoints.h"
#include
namespace BreakpointManagerPlugin {
class DialogBreakpoints : public QDialog {
Q_OBJECT
public:
explicit DialogBreakpoints(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~DialogBreakpoints() override = default;
public Q_SLOTS:
void updateList();
void on_btnAdd_clicked();
void on_btnRemove_clicked();
void on_btnCondition_clicked();
void on_tableWidget_cellDoubleClicked(int row, int col);
void on_btnImport_clicked();
void on_btnExport_clicked();
private:
void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent *event) override;
private:
Ui::DialogBreakpoints ui;
};
}
#endif
edb-debugger/plugins/BreakpointManager/BreakpointManager.cpp 0000644 0001750 0001750 00000003147 13765535463 024105 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "BreakpointManager.h"
#include "DialogBreakpoints.h"
#include "edb.h"
#include
#include
namespace BreakpointManagerPlugin {
/**
* @brief BreakpointManager::BreakpointManager
* @param parent
*/
BreakpointManager::BreakpointManager(QObject *parent)
: QObject(parent) {
}
/**
* @brief BreakpointManager::~BreakpointManager
*/
BreakpointManager::~BreakpointManager() {
delete dialog_;
}
/**
* @brief BreakpointManager::menu
* @param parent
* @return
*/
QMenu *BreakpointManager::menu(QWidget *parent) {
Q_ASSERT(parent);
if (!menu_) {
menu_ = new QMenu(tr("BreakpointManager"), parent);
menu_->addAction(tr("&Breakpoints"), this, SLOT(showMenu()), QKeySequence(tr("Ctrl+B")));
}
return menu_;
}
/**
* @brief BreakpointManager::showMenu
*/
void BreakpointManager::showMenu() {
if (!dialog_) {
dialog_ = new DialogBreakpoints(edb::v1::debugger_ui);
}
dialog_->show();
}
}
edb-debugger/plugins/BreakpointManager/BreakpointManager.h 0000644 0001750 0001750 00000002543 13765535463 023551 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef BREAKPOINT_MANAGER_H_20060430_
#define BREAKPOINT_MANAGER_H_20060430_
#include "IPlugin.h"
class QMenu;
class QDialog;
namespace BreakpointManagerPlugin {
class BreakpointManager : public QObject, public IPlugin {
Q_OBJECT
Q_INTERFACES(IPlugin)
Q_PLUGIN_METADATA(IID "edb.IPlugin/1.0")
Q_CLASSINFO("author", "Evan Teran")
Q_CLASSINFO("url", "http://www.codef00.com")
public:
explicit BreakpointManager(QObject *parent = nullptr);
~BreakpointManager() override;
public:
QMenu *menu(QWidget *parent = nullptr) override;
public Q_SLOTS:
void showMenu();
private:
QMenu *menu_ = nullptr;
QPointer dialog_ = nullptr;
};
}
#endif
edb-debugger/plugins/CheckVersion/ 0000755 0001750 0001750 00000000000 13765535463 016775 5 ustar eteran eteran edb-debugger/plugins/CheckVersion/OptionsPage.h 0000644 0001750 0001750 00000002245 13765535463 021401 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef OPTIONS_PAGE_H_20090703_
#define OPTIONS_PAGE_H_20090703_
#include "ui_OptionsPage.h"
#include
namespace CheckVersionPlugin {
class OptionsPage : public QWidget {
Q_OBJECT
public:
explicit OptionsPage(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~OptionsPage() override = default;
public:
void showEvent(QShowEvent *event) override;
public Q_SLOTS:
void on_checkBox_toggled(bool checked);
private:
Ui::OptionsPage ui;
};
}
#endif
edb-debugger/plugins/CheckVersion/CheckVersion.h 0000644 0001750 0001750 00000003162 13765535463 021533 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef CHECK_VERSION_H_20061122_
#define CHECK_VERSION_H_20061122_
#include "IPlugin.h"
class QMenu;
class QNetworkReply;
class QNetworkAccessManager;
class QUrl;
namespace CheckVersionPlugin {
class CheckVersion : public QObject, public IPlugin {
Q_OBJECT
Q_INTERFACES(IPlugin)
Q_PLUGIN_METADATA(IID "edb.IPlugin/1.0")
Q_CLASSINFO("author", "Evan Teran")
Q_CLASSINFO("url", "http://www.codef00.com")
public:
explicit CheckVersion(QObject *parent = nullptr);
~CheckVersion() override = default;
public:
QMenu *menu(QWidget *parent = nullptr) override;
QWidget *optionsPage() override;
public Q_SLOTS:
void showMenu();
private:
void requestFinished(QNetworkReply *reply);
protected:
void privateInit() override;
private:
void doCheck();
void setProxy(const QUrl &url);
private:
QMenu *menu_ = nullptr;
QNetworkAccessManager *network_ = nullptr;
bool initialCheck_ = true;
};
}
#endif
edb-debugger/plugins/CheckVersion/CMakeLists.txt 0000644 0001750 0001750 00000001532 13765535463 021536 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
include("GNUInstallDirs")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(PluginName "CheckVersion")
find_package(Qt5 5.0.0 REQUIRED Widgets Network)
add_library(${PluginName} SHARED
CheckVersion.cpp
CheckVersion.h
OptionsPage.cpp
OptionsPage.h
OptionsPage.ui
)
target_link_libraries(${PluginName} Qt5::Widgets Qt5::Network edb)
install (TARGETS ${PluginName} DESTINATION ${CMAKE_INSTALL_LIBDIR}/edb)
set_property(TARGET ${PluginName} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD 14)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${PluginName} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set_property(TARGET ${PluginName} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
edb-debugger/plugins/CheckVersion/OptionsPage.ui 0000644 0001750 0001750 00000001731 13765535463 021566 0 ustar eteran eteran
CheckVersionPlugin::OptionsPage
0
0
400
300
Check Version Plugin
-
Check for new version on startup
-
Qt::Vertical
20
262
edb-debugger/plugins/CheckVersion/CheckVersion.cpp 0000644 0001750 0001750 00000011471 13765535463 022070 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "CheckVersion.h"
#include "OptionsPage.h"
#include "edb.h"
#include "version.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace CheckVersionPlugin {
/**
* @brief CheckVersion::CheckVersion
* @param parent
*/
CheckVersion::CheckVersion(QObject *parent)
: QObject(parent) {
}
/**
* @brief CheckVersion::privateInit
*/
void CheckVersion::privateInit() {
QSettings settings;
if (settings.value("CheckVersion/check_on_start.enabled", true).toBool()) {
doCheck();
}
}
/**
* @brief CheckVersion::optionsPage
* @return
*/
QWidget *CheckVersion::optionsPage() {
return new OptionsPage;
}
/**
* @brief CheckVersion::menu
* @param parent
* @return
*/
QMenu *CheckVersion::menu(QWidget *parent) {
Q_ASSERT(parent);
if (!menu_) {
menu_ = new QMenu(tr("CheckVersion"), parent);
menu_->addAction(tr("&Check For Latest Version"), this, SLOT(showMenu()));
}
return menu_;
}
/**
* @brief CheckVersion::doCheck
*/
void CheckVersion::doCheck() {
if (!network_) {
network_ = new QNetworkAccessManager(this);
connect(network_, &QNetworkAccessManager::finished, this, &CheckVersion::requestFinished);
}
QUrl update_url(QString("https://codef00.com/projects/debugger-latest.json?v=%1").arg(edb::version));
QNetworkRequest request(update_url);
setProxy(update_url);
network_->get(request);
}
/**
* @brief CheckVersion::setProxy
* @param url
*/
void CheckVersion::setProxy(const QUrl &url) {
QNetworkProxy proxy;
#ifdef Q_OS_LINUX
Q_UNUSED(url)
auto proxy_str = QString::fromUtf8(qgetenv("HTTP_PROXY"));
if (proxy_str.isEmpty()) {
proxy_str = QString::fromUtf8(qgetenv("http_proxy"));
}
if (!proxy_str.isEmpty()) {
const QUrl proxy_url = QUrl::fromUserInput(proxy_str);
proxy = QNetworkProxy(QNetworkProxy::HttpProxy, proxy_url.host(), proxy_url.port(80), proxy_url.userName(), proxy_url.password());
}
#else
QList proxies = QNetworkProxyFactory::systemProxyForQuery(QNetworkProxyQuery(url));
if (proxies.size() >= 1) {
proxy = proxies.first();
}
#endif
network_->setProxy(proxy);
}
/**
* @brief CheckVersion::showMenu
*/
void CheckVersion::showMenu() {
initialCheck_ = false;
doCheck();
}
/**
* @brief CheckVersion::requestFinished
* @param reply
*/
void CheckVersion::requestFinished(QNetworkReply *reply) {
if (reply->error() != QNetworkReply::NoError) {
if (!initialCheck_) {
QMessageBox::critical(
nullptr,
tr("An Error Occured"),
reply->errorString());
}
} else {
QByteArray s = reply->readAll();
QJsonParseError e;
QJsonDocument d = QJsonDocument::fromJson(s, &e);
if(d.isNull() || e.error != QJsonParseError::NoError) {
qDebug("[CheckVersion] Error parsing JSON response: %s", qPrintable(e.errorString()));
return;
}
if(!d.isObject()) {
qDebug("[CheckVersion] Unexpected data format in JSON response");
return;
}
QJsonObject obj = d.object();
QString version = obj["version"].toString();
QString url = obj["url"].toString();
QString md5 = obj["md5"].toString();
QString sha1 = obj["sha1"].toString();
if(version.isEmpty() || url.isEmpty() || md5.isEmpty() || sha1.isEmpty()) {
qDebug("[CheckVersion] Unexpected data format in JSON response");
return;
}
qDebug("comparing versions: [%d] [%d]", edb::v1::int_version(version), edb::v1::edb_version());
if (edb::v1::int_version(version) > edb::v1::edb_version()) {
QMessageBox msg;
msg.setTextFormat(Qt::RichText);
msg.setWindowTitle(tr("New Version Available"));
msg.setText(tr("A newer version of edb is available: %1
"
"URL: %2
"
"MD5: %3
"
"SHA1: %4").arg(version, url, md5, sha1));
msg.setStandardButtons(QMessageBox::Ok);
msg.exec();
} else {
if (!initialCheck_) {
QMessageBox::information(
nullptr,
tr("You are up to date"),
tr("You are running the latest version of edb"));
}
}
}
reply->deleteLater();
initialCheck_ = false;
}
}
edb-debugger/plugins/CheckVersion/OptionsPage.cpp 0000644 0001750 0001750 00000002665 13765535463 021742 0 ustar eteran eteran /*
Copyright (C) 2006 - 2015 Evan Teran
evan.teran@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "OptionsPage.h"
#include
namespace CheckVersionPlugin {
/**
* @brief OptionsPage::OptionsPage
* @param parent
* @param f
*/
OptionsPage::OptionsPage(QWidget *parent, Qt::WindowFlags f)
: QWidget(parent, f) {
ui.setupUi(this);
}
/**
* @brief OptionsPage::showEvent
* @param event
*/
void OptionsPage::showEvent(QShowEvent *event) {
Q_UNUSED(event)
QSettings settings;
ui.checkBox->setChecked(settings.value("CheckVersion/check_on_start.enabled", true).toBool());
}
/**
* @brief OptionsPage::on_checkBox_toggled
* @param checked
*/
void OptionsPage::on_checkBox_toggled(bool checked) {
Q_UNUSED(checked)
QSettings settings;
settings.setValue("CheckVersion/check_on_start.enabled", ui.checkBox->isChecked());
}
}
edb-debugger/plugins/InstructionInspector/ 0000755 0001750 0001750 00000000000 13765535463 020622 5 ustar eteran eteran edb-debugger/plugins/InstructionInspector/CMakeLists.txt 0000644 0001750 0001750 00000001421 13765535463 023360 0 ustar eteran eteran cmake_minimum_required (VERSION 3.1)
include("GNUInstallDirs")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(PluginName "InstructionInspector")
find_package(Qt5 5.0.0 REQUIRED Widgets)
add_library(${PluginName} SHARED
Plugin.cpp
Plugin.h
)
target_link_libraries(${PluginName} Qt5::Widgets edb)
install (TARGETS ${PluginName} DESTINATION ${CMAKE_INSTALL_LIBDIR}/edb)
set_property(TARGET ${PluginName} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD 14)
set_property(TARGET ${PluginName} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${PluginName} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set_property(TARGET ${PluginName} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
edb-debugger/plugins/InstructionInspector/Plugin.cpp 0000644 0001750 0001750 00000131424 13765535463 022571 0 ustar eteran eteran /*
Copyright (C) 2016 Ruslan Kabatsayev
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "Plugin.h"
#include "Configuration.h"
#include "IDebugger.h"
#include "Util.h"
#include "edb.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include