diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/.gitignore b/.gitignore index 925d489..80b3eba 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,19 @@ /testsuite-9.4.0.tar.gz /testsuite-10.1.0.tar.gz /dyninst-10.1.0.tar.gz +/dyninst-10.2.0.tar.gz +/dyninst-10.2.1.tar.gz +/dyninst-11.0.0.tar.gz +/testsuite-11.0.0.tar.gz +/dyninst-11.0.1.tar.gz +/testsuite-11.0.1.tar.gz +/dyninst-12.0.1.tar.gz +/testsuite-12.0.0.tar.gz +/dyninst-12.1.0.tar.gz +/testsuite-12.1.0.tar.gz +/dyninst-12.2.0.tar.gz +/testsuite-12.2.0.tar.gz +/dyninst-12.3.0.tar.gz +/testsuite-12.3.0.tar.gz +/dyninst-13.snap.20250123.g80e1adaf.tar.gz +/dyninst-13.0.0.tar.gz diff --git a/Object-elf.patch b/Object-elf.patch deleted file mode 100644 index c579ddb..0000000 --- a/Object-elf.patch +++ /dev/null @@ -1,29 +0,0 @@ -# workaround for https://github.com/dyninst/dyninst/issues/396 - ---- ./dyninst-9.3.2/symtabAPI/src/Object-elf.C.sv 2017-09-27 21:43:18.399429243 -0400 -+++ ./dyninst-9.3.2/symtabAPI/src/Object-elf.C 2017-09-27 21:56:14.485125928 -0400 -@@ -1445,6 +1445,24 @@ - if (fbt_iter == -1) { // Create new relocation entry. - relocationEntry re( next_plt_entry_addr, offset, targ_name, - NULL, type ); -+ if (type == R_X86_64_IRELATIVE) { -+ vector funcs; -+ dyn_hash_map >::iterator iter; -+ // find the resolver function and use that as the -+ // caller function symbol. The resolver has not run -+ // so we don't know the ultimate destination. -+ // Since the funcsByOffset map hasn't been setup yet -+ // we cannot call associated_symtab->findFuncByEntryOffset -+ for (iter = symbols_.begin(); iter != symbols_.end(); ++iter) { -+ std::string name = iter->first; -+ Symbol *sym = iter->second[0]; -+ if (sym->getOffset() == (Offset)addend) { -+ // Use dynsym_list.push_back(sym) instead? -+ re.addDynSym(sym); -+ break; -+ } -+ } -+ } - re.setAddend(addend); - re.setRegionType(rtype); - if (dynsym_list.size() > 0) diff --git a/addrtranslate-sysv.patch b/addrtranslate-sysv.patch deleted file mode 100644 index 3de3a53..0000000 --- a/addrtranslate-sysv.patch +++ /dev/null @@ -1,12 +0,0 @@ -# workaround for https://github.com/dyninst/dyninst/issues/406 - ---- dyninst-9.3.2/common/src/addrtranslate-sysv.C.sv 2017-10-03 21:32:23.608614189 -0400 -+++ dyninst-9.3.2/common/src/addrtranslate-sysv.C 2017-10-03 21:33:36.538642148 -0400 -@@ -800,6 +800,7 @@ - continue; - } - if (obj_name == "linux-vdso.so.1" || -+ obj_name == "linux-vdso64.so.1" || - obj_name == "linux-gate.so.1") - { - continue; diff --git a/dyninst-10.0.0-doc.patch b/dyninst-10.0.0-doc.patch deleted file mode 100644 index 74ff705..0000000 --- a/dyninst-10.0.0-doc.patch +++ /dev/null @@ -1,12 +0,0 @@ - ---- ./dyninst-10.0.0/CMakeLists.txt.sv 2018-11-09 11:48:08.000000000 -0500 -+++ ./dyninst-10.0.0/CMakeLists.txt 2018-11-13 11:35:20.109650373 -0500 -@@ -149,7 +149,7 @@ if(BUILD_DOCS) - foreach(COMPONENT ${WORD_DOCS}) - add_dependencies(doc ${COMPONENT}-doc) - set_target_properties(${COMPONENT}-doc PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1) -- install(FILES ${CMAKE_SOURCE_DIR}/${COMPONENT}/doc/${COMPONENT}.pdf -+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${COMPONENT}/doc/${COMPONENT}.pdf - DESTINATION ${INSTALL_DOC_DIR} - RENAME ${COMPONENT}-${VERSION_STRING}.pdf - OPTIONAL diff --git a/dyninst-10.0.0-examples.patch b/dyninst-10.0.0-examples.patch deleted file mode 100644 index aee1d74..0000000 --- a/dyninst-10.0.0-examples.patch +++ /dev/null @@ -1,42 +0,0 @@ -# workaround for https://github.com/dyninst/dyninst/issues/396 - ---- ./dyninst-10.0.0/examples/CMakeLists.txt.sv 2018-11-09 11:48:08.000000000 -0500 -+++ ./dyninst-10.0.0/examples/CMakeLists.txt 2018-11-13 11:35:20.109650373 -0500 -@@ -1,19 +1,19 @@ - - --add_executable(unstrip unstrip/unstrip.C -- unstrip/util.C -- unstrip/types.C -- unstrip/semanticDescriptor.C -- unstrip/database.C -- unstrip/fingerprint.C -- unstrip/callback.C) -+add_executable(unstrip unstrip.dir/unstrip.C -+ unstrip.dir/util.C -+ unstrip.dir/types.C -+ unstrip.dir/semanticDescriptor.C -+ unstrip.dir/database.C -+ unstrip.dir/fingerprint.C -+ unstrip.dir/callback.C) - add_dependencies(unstrip parseAPI symtabAPI instructionAPI common) - target_link_libraries(unstrip parseAPI symtabAPI instructionAPI common dynDwarf dynElf ${Boost_LIBRARIES}) - --add_executable(codeCoverage codeCoverage/codeCoverage.C) -+add_executable(codeCoverage codeCoverage.dir/codeCoverage.C) - add_dependencies(codeCoverage dyninstAPI patchAPI parseAPI symtabAPI instructionAPI pcontrol common stackwalk dynDwarf dynElf) - target_link_libraries(codeCoverage dyninstAPI patchAPI parseAPI symtabAPI instructionAPI pcontrol common stackwalk dynDwarf dynElf ${Boost_LIBRARIES}) - --add_library(Inst SHARED codeCoverage/libInst.C) -+add_library(Inst SHARED codeCoverage.dir/libInst.C) - - add_executable(cfg_to_dot ../parseAPI/doc/example.cc) -@@ -29,5 +29,5 @@ - ) - --install ( -- FILES unstrip/ddb.db unstrip/params.db unstrip/unistd.db DESTINATION ${INSTALL_BIN_DIR} --) -+# install ( -+# FILES unstrip.dir/ddb.db unstrip.dir/params.db unstrip.dir/unistd.db DESTINATION ${INSTALL_BIN_DIR} -+# ) diff --git a/dyninst-10.0.0-result.patch b/dyninst-10.0.0-result.patch deleted file mode 100644 index 89d6e70..0000000 --- a/dyninst-10.0.0-result.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- ./dyninst-10.0.0/instructionAPI/h/Result.h.sv 2018-11-09 11:48:08.000000000 -0500 -+++ ./dyninst-10.0.0/instructionAPI/h/Result.h 2018-12-04 22:12:47.369579566 -0500 -@@ -449,10 +449,10 @@ - snprintf(hex, 20, "%x", val.s32val); - break; - case u64: -- snprintf(hex, 20, "%lx", val.u64val); -+ snprintf(hex, 20, "%" PRIx64, val.u64val); - break; - case s64: -- snprintf(hex, 20, "%lx", val.s64val); -+ snprintf(hex, 20, "%" PRIx64, val.s64val); - break; - case sp_float: - snprintf(hex, 20, "%f", val.floatval); -@@ -464,10 +464,10 @@ - snprintf(hex, 20, "%x", val.bitval); - break; - case u48: -- snprintf(hex, 20, "%lx", val.s48val); -+ snprintf(hex, 20, "%" PRIx64, val.s48val); - break; - case s48: -- snprintf(hex, 20, "%lx", val.s48val); -+ snprintf(hex, 20, "%" PRIx64, val.s48val); - break; - case m512: - snprintf(hex, 20, "%p", val.m512val); diff --git a/dyninst-10.0.0-tribool.patch b/dyninst-10.0.0-tribool.patch deleted file mode 100644 index 0caec2f..0000000 --- a/dyninst-10.0.0-tribool.patch +++ /dev/null @@ -1,35 +0,0 @@ -commit 54a2debd94c3e8df3b6f1e579f1db02dae61cbb7 -Author: Mark W. Krentel -Date: Fri Feb 1 13:14:11 2019 -0600 - - Add some explicit casts from boost::tribool to bool for some code in (#541) - - Add some explicit casts from boost::tribool to bool for some code in dataflowAPI/rose/util/Message.[Ch]. This was breaking the build when using boost >= 1.69. - -diff --git a/dataflowAPI/rose/util/Message.C b/dataflowAPI/rose/util/Message.C -index a8a66ad4c..5e276f97d 100644 ---- ./dyninst-10.0.0/dataflowAPI/rose/util/Message.C -+++ ./dyninst-10.0.0/dataflowAPI/rose/util/Message.C -@@ -1123,7 +1123,7 @@ StreamBuf::bake() { - destination_->bakeDestinations(message_.properties(), baked_/*out*/); - anyUnbuffered_ = false; - for (BakedDestinations::const_iterator bi=baked_.begin(); bi!=baked_.end() && !anyUnbuffered_; ++bi) -- anyUnbuffered_ = !bi->second.isBuffered; -+ anyUnbuffered_ = static_cast(!bi->second.isBuffered); - isBaked_ = true; - } - } -diff --git a/dataflowAPI/rose/util/Message.h b/dataflowAPI/rose/util/Message.h -index 816f68d2e..03592cb97 100644 ---- ./dyninst-10.0.0/dataflowAPI/rose/util/Message.h -+++ ./dyninst-10.0.0/dataflowAPI/rose/util/Message.h -@@ -386,7 +386,8 @@ struct SAWYER_EXPORT ColorSpec { - ColorSpec(AnsiColor fg, AnsiColor bg, bool bold): foreground(fg), background(bg), bold(bold) {} - - /** Returns true if this object is in its default-constructed state. */ -- bool isDefault() const { return COLOR_DEFAULT==foreground && COLOR_DEFAULT==background && !bold; } -+ bool isDefault() const { return COLOR_DEFAULT==foreground && COLOR_DEFAULT==background -+ && static_cast(!bold); } - }; - - /** Colors to use for each message importance. diff --git a/dyninst-10.1.0-result.patch b/dyninst-10.1.0-result.patch deleted file mode 100644 index 2738cf2..0000000 --- a/dyninst-10.1.0-result.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- dyninst-10.1.0/dyninst-10.1.0/instructionAPI/h/Result.h.sv 2018-11-09 11:48:08.000000000 -0500 -+++ dyninst-10.1.0/dyninst-10.1.0/instructionAPI/h/Result.h 2018-12-04 22:12:47.369579566 -0500 -@@ -449,10 +449,10 @@ - snprintf(hex, 20, "%x", val.s32val); - break; - case u64: -- snprintf(hex, 20, "%lx", val.u64val); -+ snprintf(hex, 20, "%" PRIx64, val.u64val); - break; - case s64: -- snprintf(hex, 20, "%lx", val.s64val); -+ snprintf(hex, 20, "%" PRIx64, val.s64val); - break; - case sp_float: - snprintf(hex, 20, "%f", val.floatval); -@@ -464,10 +464,10 @@ - snprintf(hex, 20, "%x", val.bitval); - break; - case u48: -- snprintf(hex, 20, "%lx", val.s48val); -+ snprintf(hex, 20, "%" PRIx64, val.s48val); - break; - case s48: -- snprintf(hex, 20, "%lx", val.s48val); -+ snprintf(hex, 20, "%" PRIx64, val.s48val); - break; - case m512: - snprintf(hex, 20, "%p", val.m512val); diff --git a/dyninst-9.3.1-Address.patch b/dyninst-9.3.1-Address.patch deleted file mode 100644 index 213cc4a..0000000 --- a/dyninst-9.3.1-Address.patch +++ /dev/null @@ -1,108 +0,0 @@ ---- dyninst-9.3.1/common/src/Types.h.sv 2017-03-07 22:05:52.187479600 -0500 -+++ dyninst-9.3.1/common/src/Types.h 2017-03-07 22:06:57.509944790 -0500 -@@ -170,7 +170,7 @@ - static const Address ADDR_NULL = (Address)(0); - #else - #define ADDR_NULL (0) --typedef uintptr_t Address; -+typedef unsigned long Address; - #endif - /* Note the inherent assumption that the size of a "long" integer matches - that of an address (void*) on every supported Paradyn/Dyninst system! - - ---- dyninst-9.3.1/common/h/dyntypes.h.sv 2017-03-08 10:16:18.657768231 -0500 -+++ dyninst-9.3.1/common/h/dyntypes.h 2017-03-08 10:37:07.992634513 -0500 -@@ -124,8 +124,8 @@ - - namespace Dyninst - { -- typedef uintptr_t Address; -- typedef uintptr_t Offset; -+ typedef unsigned long Address; -+ typedef unsigned long Offset; - - #if defined(_MSC_VER) - typedef int PID; - - ---- dyninst-9.3.1/dyninstAPI/src/BPatch_memoryAccess.C.sv 2017-03-07 23:07:29.371789000 -0500 -+++ dyninst-9.3.1/dyninstAPI/src/BPatch_memoryAccess.C 2017-03-07 23:07:48.928927991 -0500 -@@ -33,10 +33,10 @@ - #include - #include - -+#include "../../common/src/Types.h" - #include "BPatch_memoryAccess_NP.h" - #include "BPatch_Vector.h" - #include "BPatch_point.h" --#include "../../common/src/Types.h" - - BPatch_addrSpec_NP::BPatch_addrSpec_NP(long _imm, int _ra, int _rb, int _scale) : - imm(_imm), - - ---- dyninst-9.3.1/dyninstAPI/h/BPatch_instruction.h.sv 2017-03-08 09:06:46.638171175 -0500 -+++ dyninst-9.3.1/dyninstAPI/h/BPatch_instruction.h 2017-03-08 09:00:39.455564403 -0500 -@@ -69,7 +69,7 @@ - public: - - BPatch_instruction(internal_instruction *insn, -- uintptr_t _addr); -+ Dyninst::Address _addr); - virtual ~BPatch_instruction(); - - void getInstruction(const unsigned char *&_buffer, unsigned char &_length); - - ---- dyninst-9.3.1/dyninstAPI/h/BPatch_memoryAccess_NP.h.sv 2017-03-07 22:43:56.645745821 -0500 -+++ dyninst-9.3.1/dyninstAPI/h/BPatch_memoryAccess_NP.h 2017-03-08 10:39:30.122643332 -0500 -@@ -121,27 +121,27 @@ - static BPatch_memoryAccess* init_tables(); - - // initializes only the first access; #bytes is a constant -- BPatch_memoryAccess(internal_instruction *, uintptr_t _addr, -+ BPatch_memoryAccess(internal_instruction *, Dyninst::Address _addr, - bool _isLoad, bool _isStore, unsigned int _bytes, - long _imm, int _ra, int _rb, unsigned int _scale = 0, - int _cond = -1, bool _nt = false); - - // initializes only the first access; #bytes is an expression w/scale -- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr, -+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr, - bool _isinternal_Load, bool _isStore, - long _imm_s, int _ra_s, int _rb_s, unsigned int _scale_s, - long _imm_c, int _ra_c, int _rb_c, unsigned int _scale_c, - int _cond, bool _nt, int _preFcn = -1); - - // initializes only the first access; #bytes is an expression -- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr, -+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr, - bool _isLoad, bool _isStore, bool _isPrefetch, - long _imm_s, int _ra_s, int _rb_s, - long _imm_c, int _ra_c, int _rb_c, - unsigned short _preFcn); - - // initializes only the first access; #bytes is an expression & not a prefetch -- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr, -+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr, - bool _isLoad, bool _isStore, long _imm_s, int _ra_s, int _rb_s, - long _imm_c, int _ra_c, int _rb_c); - -@@ -156,14 +156,14 @@ - int _cond, bool _nt); - - // initializes both accesses; #bytes is a constant -- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr, -+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr, - bool _isLoad, bool _isStore, unsigned int _bytes, - long _imm, int _ra, int _rb, unsigned int _scale, - bool _isLoad2, bool _isStore2, unsigned int _bytes2, - long _imm2, int _ra2, int _rb2, unsigned int _scale2); - - // initializes both accesses; #bytes is an expression & not a prefetch -- BPatch_memoryAccess(internal_instruction *insn, uintptr_t _addr, bool _isLoad, bool _isStore, -+ BPatch_memoryAccess(internal_instruction *insn, Dyninst::Address _addr, bool _isLoad, bool _isStore, - long _imm_s, int _ra_s, int _rb_s, unsigned int _scale_s, - long _imm_c, int _ra_c, int _rb_c, unsigned int _scale_c, - bool _isLoad2, bool _isStore2, long _imm2_s, int _ra2_s, diff --git a/dyninst-9.3.2-gcc8.patch b/dyninst-9.3.2-gcc8.patch deleted file mode 100644 index faec1a1..0000000 --- a/dyninst-9.3.2-gcc8.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff -up dyninst-9.3.2/dyninst-9.3.2/symtabAPI/src/emitElf.C.me dyninst-9.3.2/dyninst-9.3.2/symtabAPI/src/emitElf.C ---- dyninst-9.3.2/dyninst-9.3.2/symtabAPI/src/emitElf.C.me 2018-02-07 15:50:36.706363500 +0100 -+++ dyninst-9.3.2/dyninst-9.3.2/symtabAPI/src/emitElf.C 2018-02-07 16:30:28.173906877 +0100 -@@ -2512,8 +2512,8 @@ void emitElf::createDynamicSec - - if (!object->hasReldyn() && !object->hasReladyn()) { - if (object->getRelType() == Region::RT_REL) { -- new_dynamic_entries.push_back(make_pair(DT_REL, 0)); -- new_dynamic_entries.push_back(make_pair(DT_RELSZ, 0)); -+ new_dynamic_entries.push_back(std::pair(DT_REL, 0)); -+ new_dynamic_entries.push_back(std::pair(DT_RELSZ, 0)); - - dynamicSecData[DT_REL].push_back(dynsecData + curpos); - dynsecData[curpos].d_tag = DT_NULL; diff --git a/dyninst-9.3.2-glibc-rpc.patch b/dyninst-9.3.2-glibc-rpc.patch deleted file mode 100644 index 1f6098e..0000000 --- a/dyninst-9.3.2-glibc-rpc.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff -up dyninst-9.3.2/dyninst-9.3.2/CMakeLists.txt.me dyninst-9.3.2/dyninst-9.3.2/CMakeLists.txt ---- dyninst-9.3.2/dyninst-9.3.2/CMakeLists.txt.me 2018-02-07 15:25:38.925763122 +0100 -+++ dyninst-9.3.2/dyninst-9.3.2/CMakeLists.txt 2018-02-07 15:30:42.242099198 +0100 -@@ -19,6 +19,7 @@ include (${DYNINST_ROOT}/cmake/shared.cm - configure_file(cmake/version.h.in common/h/version.h) - include_directories(${PROJECT_BINARY_DIR}) - include_directories(${PROJECT_BINARY_DIR}/common/h) -+include_directories("/usr/include/tirpc/") - set (HEADER_DIRS common - dataflowAPI - dyninstAPI -diff -up dyninst-9.3.2/dyninst-9.3.2/common/src/linuxHeaders.h.me dyninst-9.3.2/dyninst-9.3.2/common/src/linuxHeaders.h ---- dyninst-9.3.2/dyninst-9.3.2/common/src/linuxHeaders.h.me 2018-02-07 15:06:45.961780668 +0100 -+++ dyninst-9.3.2/dyninst-9.3.2/common/src/linuxHeaders.h 2018-02-07 15:38:56.832278338 +0100 -@@ -281,7 +281,7 @@ inline bool_t P_xdr_string(XDR *x, char - inline void P_xdrrec_create(XDR *x, const u_int send_sz, const u_int rec_sz, - const caddr_t handle, - xdr_rd_func read_r, xdr_wr_func write_f) { -- xdrrec_create(x, send_sz, rec_sz, handle, (int(*)(char*, char*, int))read_r, (int(*)(char*, char*, int))write_f);} -+ xdrrec_create(x, send_sz, rec_sz, handle, (int(*)(void*, void*, int))read_r, (int(*)(void*, void*, int))write_f);} - inline bool_t P_xdrrec_endofrecord(XDR *x, int now) { - return (xdrrec_endofrecord(x, now));} - inline bool_t P_xdrrec_skiprecord(XDR *x) { return (xdrrec_skiprecord(x));} diff --git a/dyninst.spec b/dyninst.spec index 49a317f..833197a 100644 --- a/dyninst.spec +++ b/dyninst.spec @@ -1,39 +1,35 @@ Summary: An API for Run-time Code Generation -License: LGPLv2+ +License: LGPL-2.1-or-later AND GPL-3.0-or-later WITH Bison-exception-2.2 AND LicenseRef-Fedora-Public-Domain AND BSD-3-Clause Name: dyninst -Release: 3%{?dist} -URL: http://www.dyninst.org -Version: 10.1.0 -ExclusiveArch: %{ix86} x86_64 ppc64le aarch64 +Group: Development/Libraries +Release: 8%{?dist} +URL: https://www.paradyn.org +Version: 13.0.0 +ExclusiveArch: x86_64 ppc64le aarch64 -Source0: https://github.com/dyninst/dyninst/archive/v%{version}/dyninst-%{version}.tar.gz -Source1: https://github.com/dyninst/testsuite/archive/v%{version}/testsuite-%{version}.tar.gz - -Patch1: dyninst-10.1.0-result.patch -Patch2: testsuite-10.1.0-gettid.patch -Patch3: testsuite-10.1.0-386.patch +Source0: dyninst-13.0.0.tar.gz +Patch1: github-pr1721.patch +Patch2: github-pr1880.patch +Patch3: github-pr1880-ish.patch +Patch4: github-pr1730.patch %global dyninst_base dyninst-%{version} -%global testsuite_base testsuite-%{version} BuildRequires: gcc-c++ BuildRequires: elfutils-devel BuildRequires: elfutils-libelf-devel +BuildRequires: elfutils-debuginfod-client-devel BuildRequires: boost-devel BuildRequires: binutils-devel BuildRequires: cmake BuildRequires: libtirpc-devel BuildRequires: tbb tbb-devel +BuildRequires: tex-latex +BuildRequires: make -# Extra requires just for the testsuite -BuildRequires: gcc-gfortran glibc-static libstdc++-static nasm libxml2-devel - -# Testsuite files should not provide/require anything -%{?filter_setup: -%filter_provides_in %{_libdir}/dyninst/testsuite/ -%filter_requires_in %{_libdir}/dyninst/testsuite/ -%filter_setup -} +# https://fedoraproject.org/wiki/Changes/Linker_Error_On_Security_Issues +# may impact the RT library +%undefine _hardened_linker_errors %description @@ -47,49 +43,40 @@ the creation of tools and applications that use run-time code patching. %package doc Summary: Documentation for using the Dyninst API +Group: Documentation %description doc dyninst-doc contains API documentation for the Dyninst libraries. +License: LGPL-2.1-or-later %package devel Summary: Header files for compiling programs with Dyninst +Group: Development/System Requires: dyninst = %{version}-%{release} Requires: boost-devel Requires: tbb-devel +License: LGPL-2.1-or-later AND BSD-3-Clause AND MIT +# FindTBB.cmake: presumed MIT, removed in next version of dyninst %description devel dyninst-devel includes the C header files that specify the Dyninst user-space libraries and interfaces. This is required for rebuilding any program that uses Dyninst. -%package static -Summary: Static libraries for the compiling programs with Dyninst -Requires: dyninst-devel = %{version}-%{release} -%description static -dyninst-static includes the static versions of the library files for -the dyninst user-space libraries and interfaces. - -%package testsuite -Summary: Programs for testing Dyninst -Requires: dyninst = %{version}-%{release} -Requires: dyninst-devel = %{version}-%{release} -Requires: dyninst-static = %{version}-%{release} -Requires: glibc-static -%description testsuite -dyninst-testsuite includes the test harness and target programs for -making sure that dyninst works properly. - %prep %setup -q -n %{name}-%{version} -c -%setup -q -T -D -a 1 +# %setup -q -T -D -a 1 -%patch1 -p1 -b.result -%patch2 -p1 -b.gettid -%patch3 -p1 -b.386 +pushd %{dyninst_base} +%patch -P1 -p1 +%patch -P2 -p1 +%patch -P3 -p1 +%patch -P4 -p1 +popd # cotire seems to cause non-deterministic gcc errors # https://bugzilla.redhat.com/show_bug.cgi?id=1420551 -sed -i.cotire -e 's/USE_COTIRE true/USE_COTIRE false/' \ - %{dyninst_base}/cmake/shared.cmake +# sed -i.cotire -e 's/USE_COTIRE true/USE_COTIRE false/' \ +# %{dyninst_base}/cmake/shared.cmake %build @@ -97,46 +84,34 @@ cd %{dyninst_base} CFLAGS="$CFLAGS $RPM_OPT_FLAGS" LDFLAGS="$LDFLAGS $RPM_LD_FLAGS" +%ifarch %{ix86} + CFLAGS="$CFLAGS -fno-lto -march=i686" + LDFLAGS="$LDFLAGS -fno-lto" +%endif CXXFLAGS="$CFLAGS" export CFLAGS CXXFLAGS LDFLAGS -%cmake \ - -DENABLE_STATIC_LIBS=1 \ - -DINSTALL_LIB_DIR:PATH=%{_libdir}/dyninst \ - -DINSTALL_INCLUDE_DIR:PATH=%{_includedir}/dyninst \ - -DINSTALL_CMAKE_DIR:PATH=%{_libdir}/cmake/Dyninst \ +%cmake --log-level=DEBUG \ + -DENABLE_DEBUGINFOD=1 \ -DCMAKE_BUILD_TYPE=None \ -DCMAKE_SKIP_RPATH:BOOL=YES \ - . -%make_build - -# Hack to install dyninst nearby, so the testsuite can use it -make DESTDIR=../install install -find ../install -name '*.cmake' -execdir \ - sed -i -e 's!%{_prefix}!../install&!' '{}' '+' -# cmake mistakenly looks for libtbb.so in the dyninst install dir -sed -i '/libtbb.so/ s/".*usr/"\/usr/' $PWD/../install%{_libdir}/cmake/Dyninst/commonTargets.cmake - -cd ../%{testsuite_base} -%cmake \ - -DDyninst_DIR:PATH=$PWD/../install%{_libdir}/cmake/Dyninst \ - -DINSTALL_DIR:PATH=%{_libdir}/dyninst/testsuite \ - -DCMAKE_BUILD_TYPE:STRING=Debug \ - -DCMAKE_SKIP_RPATH:BOOL=YES \ - . -%make_build + -DINSTALL_CMAKE_DIR:PATH=/usr/lib64/cmake/Dyninst \ + -DCMAKE_INSTALL_PREFIX:PATH=/usr \ + -DCMAKE_INSTALL_INCLUDEDIR:PATH=/usr/include/dyninst \ + -DCMAKE_INSTALL_LIBDIR:PATH=/usr/lib64/dyninst +%cmake_build -v -v -v %install cd %{dyninst_base} -%make_install +%cmake_install -v -v -v -# It doesn't install docs the way we want, so remove them. -# We'll just grab the pdfs later, directly from the build dir. -rm -v %{buildroot}%{_docdir}/*-%{version}.pdf +# move /usr/lib64//dyninst/cmake/Dyninst to /usr/lib64/cmake/Dyninst +mkdir -p %{buildroot}/%{_libdir}/cmake +mv %{buildroot}/%{_libdir}/dyninst/cmake/Dyninst %{buildroot}/%{_libdir}/cmake/Dyninst -cd ../%{testsuite_base} -%make_install +# this is a testsuite-like binary, not needed in main package +rm -f "%{buildroot}%{_bindir}/parseThat" mkdir -p %{buildroot}/etc/ld.so.conf.d echo "%{_libdir}/dyninst" > %{buildroot}/etc/ld.so.conf.d/%{name}-%{_arch}.conf @@ -149,6 +124,7 @@ echo "%{_libdir}/dyninst" > %{buildroot}/etc/ld.so.conf.d/%{name}-%{_arch}.conf %{_libdir}/dyninst/*.so.* # dyninst mutators dlopen the runtime library %{_libdir}/dyninst/libdyninstAPI_RT.so +%{_libdir}/dyninst/libdyninstAPI_RT.a %doc %{dyninst_base}/COPYRIGHT %doc %{dyninst_base}/LICENSE.md @@ -171,22 +147,151 @@ echo "%{_libdir}/dyninst" > %{buildroot}/etc/ld.so.conf.d/%{name}-%{_arch}.conf %{_libdir}/dyninst/*.so %{_libdir}/cmake/Dyninst -%files static -%{_libdir}/dyninst/*.a - -%files testsuite -%{_bindir}/parseThat -%exclude %{_bindir}/cfg_to_dot -%exclude /usr/bin/codeCoverage -%exclude /usr/bin/unstrip -%exclude /usr/bin/ddb.db -%exclude /usr/bin/params.db -%exclude /usr/bin/unistd.db -%dir %{_libdir}/dyninst/testsuite/ -%attr(755,root,root) %{_libdir}/dyninst/testsuite/*[!a] -%attr(644,root,root) %{_libdir}/dyninst/testsuite/*.a - %changelog +* Mon Jan 12 2026 Jonathan Wakely - 13.0.0-8 +- Rebuilt for Boost 1.90 + +* Wed Aug 20 2025 Jerry James - 13.0.0-7 +- Rebuild for tbb 2022.2.0 + +* Wed Jul 23 2025 Fedora Release Engineering - 13.0.0-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + +* Thu Feb 06 2025 Frank Ch. Eigler - 13.0.0-5 +- Backported github PR/1370 for constructor ordering. + +* Thu Jan 23 2025 Frank Ch. Eigler - 13.0.0-4 +- Rebuilt for F42 FTBFS with 13.0.0 + backported fixes + sans i686 + +* Thu Jan 16 2025 Fedora Release Engineering - 12.3.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + +* Wed Jul 17 2024 Fedora Release Engineering - 12.3.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Wed Jan 24 2024 Fedora Release Engineering - 12.3.0-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Fri Jan 19 2024 Fedora Release Engineering - 12.3.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Wed Jan 17 2024 Jonathan Wakely - 12.3.0-4 +- Rebuilt for Boost 1.83 + +* Wed Jul 19 2023 Fedora Release Engineering - 12.3.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Tue Jul 11 2023 Frank Ch. Eigler - 12.3.0-2 +- side-tag respin + +* Tue Jul 04 2023 Frank Ch. Eigler - 12.3.0-1 +- migrated to SPDX license + +* Tue Jul 04 2023 Orion Poplawski - 12.3.0-1 +- Update to 12.3.0 +- Add patch for cmake 3.27 support + +* Tue Jun 27 2023 Jonathan Wakely - 12.2.0-5 +- Patch for oneTBB (#2036372) + +* Thu Feb 23 2023 Frank Ch. Eigler - 12.2.0-4 +- rhbz2173030: ftbfs with gcc 13 + +* Mon Feb 20 2023 Jonathan Wakely - 12.2.0-3 +- Rebuilt for Boost 1.81 + +* Thu Jan 19 2023 Fedora Release Engineering - 12.2.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Tue Oct 4 2022 William Cohen - 12.2.0-1 +- Update to 12.2.0 + +* Wed Aug 03 2022 Stan Cox - 12.1.0-4 +- Explicitly include time.h as no longer pulls it in + +* Thu Jul 21 2022 Fedora Release Engineering - 12.1.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Wed May 04 2022 Thomas Rodgers - 12.1.0-2 +- Rebuilt for Boost 1.78 + +* Thu Mar 10 2022 William Cohen - 12.1.0-1 +- Update to 12.1.0 + +* Sat Mar 05 2022 Orion Poplawski - 12.0.1-4 +- Fix cmake build dir + +* Mon Feb 07 2022 Stan Cox - 12.0.1-3 +- Quiesce dwarf 5 warnings + +* Thu Jan 20 2022 Fedora Release Engineering - 12.0.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Mon Jan 10 2022 Stan Cox - 12.0.1-1 +- Update to 12.0.1 + +* Tue Nov 09 2021 Stan Cox - 11.0.1-4 +- Do not create reloc for aarch64 static calls + +* Fri Aug 06 2021 Jonathan Wakely - 11.0.1-3 +- Rebuilt for Boost 1.76 + +* Wed Jul 21 2021 Fedora Release Engineering - 11.0.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Thu Jul 08 2021 Stan Cox - 11.0.1 +- Update to 11.0.1 + +* Fri Apr 30 2021 Stan Cox - 11.0.0 +- Update to 11.0.0 + +* Tue Mar 30 2021 Jonathan Wakely - 10.2.1-6 +- Rebuilt for removed libstdc++ symbol (#1937698) + +* Fri Jan 29 2021 Frank Ch. Eigler - 10.2.1-5 +- Rebuilt for Boost 1.75 for sure, via buildrequire version constraints + +* Tue Jan 26 2021 Fedora Release Engineering - 10.2.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Fri Jan 22 2021 Jonathan Wakely - 10.2.1-3 +- Rebuilt for Boost 1.75 + +* Tue Nov 10 2020 Stan Cox - 10.2.1-2 +- Enable debuginfod + +* Wed Oct 28 2020 Stan Cox - 10.2.1-1 +- Update to 10.2.1 + +* Tue Oct 27 2020 Jeff Law - 10.2.0-2 +- Fix C++17 issue caught by gcc-11 + +* Tue Sep 01 2020 Stan Cox - 10.2.0-1 +- Update to 10.2.0 + +* Mon Aug 10 2020 Orion Poplawski - 10.1.0-10 +- Use new cmake macros (FTBFS bz#1863463) +- Add BR tex-latex for doc build + +* Sat Aug 01 2020 Fedora Release Engineering - 10.1.0-9 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jul 27 2020 Fedora Release Engineering - 10.1.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jul 15 2020 Stan Cox - 10.1.0-7 +- Do not build static versions of the dyninst libraries. + +* Fri May 29 2020 Jonathan Wakely - 10.1.0-6 +- Rebuilt for Boost 1.73 + +* Tue Jan 28 2020 Fedora Release Engineering - 10.1.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Fri Nov 15 2019 Stan Cox - 10.1.0-4 +- Fix rhbz963475 dyninst must be ported to aarch64 + * Wed Jul 24 2019 Fedora Release Engineering - 10.1.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild diff --git a/gating.yaml b/gating.yaml new file mode 100644 index 0000000..ce3cdc1 --- /dev/null +++ b/gating.yaml @@ -0,0 +1,19 @@ +--- !Policy +product_versions: + - fedora-* +decision_context: bodhi_update_push_stable +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} +--- !Policy +product_versions: + - rhel-8 +decision_context: osci_compose_gate +rules: + - !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1.functional} +--- !Policy +product_versions: + - rhel-9 +decision_context: osci_compose_gate +rules: + - !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1.functional} diff --git a/github-pr1721.patch b/github-pr1721.patch new file mode 100644 index 0000000..3fde0c9 --- /dev/null +++ b/github-pr1721.patch @@ -0,0 +1,55 @@ +commit e70b1001eb5082bb0204b602e3ca1cfccd67fc94 +gpg: Signature made Tue 09 Apr 2024 11:21:17 AM EDT +gpg: using RSA key B5690EEEBB952194 +gpg: Can't check signature: No public key +Author: kupsch +Date: Tue Apr 9 10:21:17 2024 -0500 + + improve cmake install dirs (#1721) + + * Use cmake's GNUInstallDirs to get the lib, bin and include directory + names instead of always using 'lib', 'bin', and 'include'. This + results in two changes to the installation: + + - lib directory becomes 'lib64' on platforms where this is the + convention + + - the lib, bin and include may be overwritten using the cmake + variables CMAKE_INSTALL_BINDIR, CMAKE_INSTALL_LIBDIR and + CMAKE_INSTALL_INCLUDEDIR respectively + + * Update github workflows to handle the lib install dir lib64: + + - use Dyninst_ROOT instead of Dyninst_DIR as it searches for the + directory used + + - for non-cmake uses search for lib* to find either lib or lib64 + +diff --git a/cmake/DyninstLibrarySettings.cmake b/cmake/DyninstLibrarySettings.cmake +index d3627f8789f2..e8cb26b95c39 100644 +--- a/cmake/DyninstLibrarySettings.cmake ++++ b/cmake/DyninstLibrarySettings.cmake +@@ -25,9 +25,10 @@ else() + set(CMAKE_VISIBILITY_INLINES_HIDDEN ON) + endif() + +-set(DYNINST_INSTALL_BINDIR "bin") +-set(DYNINST_INSTALL_LIBDIR "lib") +-set(DYNINST_INSTALL_INCLUDEDIR "include") ++include(GNUInstallDirs) ++set(DYNINST_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}") ++set(DYNINST_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}") ++set(DYNINST_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}") + set(DYNINST_INSTALL_CMAKEDIR "${DYNINST_INSTALL_LIBDIR}/cmake/Dyninst") + + # -- Set up the RPATH --- +diff --git a/parseThat/CMakeLists.txt b/parseThat/CMakeLists.txt +index ffe4b7aea29c..d4697a8a1d99 100644 +--- a/parseThat/CMakeLists.txt ++++ b/parseThat/CMakeLists.txt +@@ -29,4 +29,4 @@ target_link_libraries(parseThat PRIVATE dyninstAPI) + target_include_directories(parseThat BEFORE + PRIVATE "$") + +-install(TARGETS parseThat RUNTIME DESTINATION bin) ++install(TARGETS parseThat RUNTIME DESTINATION "${DYNINST_INSTALL_BINDIR}") diff --git a/github-pr1730.patch b/github-pr1730.patch new file mode 100644 index 0000000..72c667e --- /dev/null +++ b/github-pr1730.patch @@ -0,0 +1,151 @@ +commit eae798d4e5f938cb85758571dbab9afbbea7b5d2 (HEAD -> v13.0.0) +Author: Frank Ch. Eigler +Date: Thu Feb 6 08:35:33 2025 -0500 + + MachRegister: fix initialization order bug (#1731) + + Backported upstream commit to 13.0.0 base. + + commit a29f32ac87c4483b97a2c5cb9beed5642124ae8f + Author: Tim Haines + Date: Mon Apr 22 15:32:12 2024 -0500 + + MachRegister: fix initialization order bug (#1731) + + This fixes the static initialization ordering issue reported in https://github.com/dyninst/dyninst/issues/1730. + +diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt +index 669659e44c76..b6507772858c 100644 +--- a/common/CMakeLists.txt ++++ b/common/CMakeLists.txt +@@ -39,7 +39,6 @@ set(_public_headers + h/registers/AMDGPU/amdgpu_gfx90a_regs.h + h/registers/AMDGPU/amdgpu_gfx940_regs.h + h/registers/cuda_regs.h +- h/registers/MachRegister.h + h/registers/ppc32_regs.h + h/registers/ppc64_regs.h + h/registers/reg_def.h +@@ -72,12 +71,12 @@ set(_private_headers + src/lprintf.h + src/lru_cache.h + src/MappedFile.h ++ src/registers/MachRegisterCache.h + src/NodeIterator.h + src/ntHeaders.h + src/parseauxv.h + src/pathName.h + src/pool_allocators.h +- src/registers/MachRegister.C + src/sha1.h + src/singleton_object_pool.h + src/stats.h +@@ -111,6 +110,7 @@ set(_sources + src/debug_common.C + src/VariableLocation.C + src/Buffer.C ++ src/registers/MachRegister.C + src/MachSyscall.C) + + if(DYNINST_OS_UNIX) +diff --git a/common/src/dyn_regs.C b/common/src/dyn_regs.C +index 3fcd194a71dd..7951dbe753bc 100644 +--- a/common/src/dyn_regs.C ++++ b/common/src/dyn_regs.C +@@ -28,8 +28,16 @@ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + ++#include "registers/MachRegisterCache.h" ++ ++namespace Dyninst { namespace registers { ++ // These are used in MachRegister.C ++ name_cache names; ++}} ++ + //clang-format: off + #define DYN_DEFINE_REGS + #include "dyn_regs.h" + #undef DYN_DEFINE_REGS + //clang-format: on ++ +diff --git a/common/src/registers/MachRegister.C b/common/src/registers/MachRegister.C +index ccd01abc1811..93c020c04415 100644 +--- a/common/src/registers/MachRegister.C ++++ b/common/src/registers/MachRegister.C +@@ -1,4 +1,5 @@ + #include "common/h/registers/MachRegister.h" ++#include "registers/MachRegisterCache.h" + #include "debug_common.h" + #include "dyn_regs.h" + #include "external/rose/amdgpuInstructionEnum.h" +@@ -10,17 +11,24 @@ + #include + + namespace { +- std::unordered_map names; + const std::string invalid_reg_name{""}; + } + ++namespace Dyninst { namespace registers { ++ // These are defined in dyn_regs.C to ensure global constructor initialization ordering ++ extern name_cache names; ++ } ++} ++ ++ + namespace Dyninst { + + MachRegister::MachRegister() : reg(0) {} + + MachRegister::MachRegister(signed int r) : reg(r) {} + +- MachRegister::MachRegister(signed int r, std::string n) : reg(r) { names.emplace(r, std::move(n)); } ++ MachRegister::MachRegister(signed int r, std::string n) : reg(r) { ++ registers::names.emplace(r, std::move(n)); } + + unsigned int MachRegister::regClass() const { return reg & 0x00ff0000; } + +@@ -106,8 +114,8 @@ namespace Dyninst { + bool MachRegister::isValid() const { return (reg != InvalidReg.reg); } + + std::string const& MachRegister::name() const { +- auto iter = names.find(reg); +- if(iter != names.end()) { ++ auto iter = registers::names.find(reg); ++ if(iter != registers::names.end()) { + return iter->second; + } + common_parsing_printf("No MachRegister found with value %x\n", static_cast(reg)); +diff --git a/common/src/dyn_regs.C b/common/src/registers/MachRegisterCache.h +similarity index 80% +copy from common/src/dyn_regs.C +copy to common/src/registers/MachRegisterCache.h +index 3fcd194a71dd..2a74bbde821a 100644 +--- a/common/src/dyn_regs.C ++++ b/common/src/registers/MachRegisterCache.h +@@ -28,8 +28,19 @@ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +-//clang-format: off +-#define DYN_DEFINE_REGS +-#include "dyn_regs.h" +-#undef DYN_DEFINE_REGS +-//clang-format: on ++#ifndef DYNINST_COMMON_REGISTERS_MACHREGISTERCACHE_H ++#define DYNINST_COMMON_REGISTERS_MACHREGISTERCACHE_H ++ ++#include "registers/MachRegister.h" ++ ++#include ++#include ++#include ++#include ++ ++namespace Dyninst { namespace registers { ++ typedef std::unordered_map name_cache; ++}} ++ ++ ++#endif diff --git a/github-pr1880-ish.patch b/github-pr1880-ish.patch new file mode 100644 index 0000000..77e763f --- /dev/null +++ b/github-pr1880-ish.patch @@ -0,0 +1,36 @@ +diff --git a/common/h/Annotatable.h b/common/h/Annotatable.h +index 6588e3dd36da..262a193ffbb8 100644 +--- a/common/h/Annotatable.h ++++ b/common/h/Annotatable.h +@@ -44,6 +44,7 @@ + #include + #include + #include ++#include + #include "util.h" + #include "compiler_annotations.h" + +diff --git a/instructionAPI/h/ArchSpecificFormatters.h b/instructionAPI/h/ArchSpecificFormatters.h +index b32d4cc14e03..145c604f9619 100644 +--- a/instructionAPI/h/ArchSpecificFormatters.h ++++ b/instructionAPI/h/ArchSpecificFormatters.h +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + #include "Architecture.h" + #include "registers/MachRegister.h" + +diff --git a/common/src/arch-x86.h b/common/src/arch-x86.h +index ecdc3dc13..7745306d3 100644 +--- a/common/src/arch-x86.h ++++ b/common/src/arch-x86.h +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + #include "entryIDs.h" + #include "registers/MachRegister.h" + #include "common/src/ia32_locations.h" diff --git a/github-pr1880.patch b/github-pr1880.patch new file mode 100644 index 0000000..c8f8795 --- /dev/null +++ b/github-pr1880.patch @@ -0,0 +1,23 @@ +commit 165402aa1640afb394b11a096b38c6bc3a5bf9d0 (github-fche/patch-1) +gpg: Signature made Wed 22 Jan 2025 03:35:55 PM EST +gpg: using RSA key B5690EEEBB952194 +gpg: Can't check signature: No public key +Author: Frank Ch. Eigler +Date: Wed Jan 22 15:35:55 2025 -0500 + + Update sha1.C: #include + + Subject header is needed on gcc15 to compile sha1.C, supplying declaration of types like uint32_t. + +diff --git a/common/src/sha1.C b/common/src/sha1.C +index 91e9ad291561..d6e76c5727ac 100644 +--- a/common/src/sha1.C ++++ b/common/src/sha1.C +@@ -102,6 +102,7 @@ A million repetitions of "a" + + #include + #include ++#include + + #include "dyntypes.h" + #include "common/src/sha1.h" diff --git a/plans/ci.fmf b/plans/ci.fmf new file mode 100644 index 0000000..3fd3ab7 --- /dev/null +++ b/plans/ci.fmf @@ -0,0 +1,5 @@ +summary: CI Gating Plan +discover: + how: fmf +execute: + how: tmt diff --git a/sources b/sources index 1ccb90f..5cadd84 100644 --- a/sources +++ b/sources @@ -1,2 +1 @@ -SHA512 (testsuite-10.1.0.tar.gz) = 47b91ebc0623f672378086a5f8d84e3934bd6b22d8932b12aaad257ccf7eb109505edb63dfbc3eb15aa099fc488a517835412099a77e3e0dd1275b3e3f672b3b -SHA512 (dyninst-10.1.0.tar.gz) = 41d7b6f0fce56be84091cc9796b7fa3295a652f80203b6e246df3a28a7bdc02a11996a38c9ccfb2ea7c18ee937a93020ff31d5d4652fd8082f99167e94b16df6 +SHA512 (dyninst-13.0.0.tar.gz) = efa09018c411f6138e6e2cf6510007b29b00ed9e0d643df702303ee0ccb39b1ea1640bba18555f4cb0a7dbab677362c88ffe0eccace62b57860daee9350a4eee diff --git a/tests/Sanity/smoke-test/dynamic-double/Makefile b/tests/Sanity/smoke-test/dynamic-double/Makefile new file mode 100644 index 0000000..22c77b3 --- /dev/null +++ b/tests/Sanity/smoke-test/dynamic-double/Makefile @@ -0,0 +1,19 @@ +CPP=g++ +#DYNINST_ROOT=/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst +LINK=-L/opt/rh/devtoolset-3/root/usr/lib$(BITS)/dyninst -L/opt/rh/devtoolset-3/root/usr/lib$(BITS)/dyninst/lib +# -ldyninstAPI -ldynC -ldl +#LINK=-L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst -L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst/lib -ldyninstAPI -ldl + +INCLUDE=-I/opt/rh/devtoolset-3/root/usr/include/dyninst +LINK2=-ldyninstAPI -ldl -lboost_system + +all: mutatee mutator + +clean: + rm mutatee mutator + +mutatee: mutatee.cpp + $(CPP) -g -o mutatee mutatee.cpp + +mutator: mutator.cpp + $(CPP) -g -o mutator $(INCLUDE) $(LINK) $(LINK2) mutator.cpp diff --git a/tests/Sanity/smoke-test/dynamic-double/mutatee.cpp b/tests/Sanity/smoke-test/dynamic-double/mutatee.cpp new file mode 100644 index 0000000..eead3bb --- /dev/null +++ b/tests/Sanity/smoke-test/dynamic-double/mutatee.cpp @@ -0,0 +1,49 @@ +#include +#include +#include + +using namespace std; + +int a = 0; + +void incr(void) +{ + a++; +} + +void incr2(void) +{ + a += 100; +} + +int function_name(void) +{ + fprintf(stderr, "FUNCTION EXECUTED. VALUE = %i\n", a); +} + +int main(int argc, char **argv) +{ + int n = 10, i; + FILE *f = fopen("RESULT.log", "w"); + if(argc > 1) + { + if((n = atoi(argv[1])) <= 0) + n = 10; + } + else + n = 10; + + for(i = 0; i < n; i++) + { + function_name(); + sleep(3); + } + + if((a > 200) && (a % 100 > 0)) + fprintf(f, "MUTATION OK.\n"); + else + fprintf(f, "MUTATION FAILED.\n"); + + fclose(f); + return !a; +} diff --git a/tests/Sanity/smoke-test/dynamic-double/mutator.cpp b/tests/Sanity/smoke-test/dynamic-double/mutator.cpp new file mode 100644 index 0000000..550ccbe --- /dev/null +++ b/tests/Sanity/smoke-test/dynamic-double/mutator.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include + +// dyninst libraries + +#include "BPatch.h" +#include "BPatch_addressSpace.h" +#include "BPatch_process.h" +#include "BPatch_function.h" +#include "BPatch_point.h" +//#include "BPatch_flowGraph.h" + +using namespace std; + + + + +int main(int argc, char **argv) +{ + BPatch bpatch1, bpatch2; + int pid; + BPatch_process *app_proc; + BPatch_addressSpace *aspace; + BPatch_image *image; + + // check the options + if(argc != 2) + { + cerr << "ERROR ## Missing command line args. Use PID of the process you want to attach.\n"; + return 1; + } + + pid = atoi(argv[1]); + if(pid == 0) + { + cerr << "ERROR ## Wrong PID " << pid << ", please use another.\n"; + return 2; + } + + cerr << "TAKE1 A\n"; + // let's go... + app_proc = bpatch1.processAttach(NULL, pid); + cerr << "TAKE1 B\n"; + aspace = app_proc; + cerr << "TAKE1 C\n"; + image = aspace->getImage(); + cerr << "TAKE1 D\n"; + +/* BPatch_Set access_types; + access_types.insert(BPatch_opLoad); + access_types.insert(BPatch_opStore); +*/ + vector functions, incr_functions; + vector *points; + image->findFunction("function_name", functions); + cerr << "TAKE1 E\n"; + points = functions[0]->findPoint(BPatch_entry); + cerr << "TAKE1 F\n"; + + // create snippet + image->findFunction("incr", incr_functions); + cerr << "TAKE1 G\n"; + vector incr_args; + BPatch_funcCallExpr incr_call(*(incr_functions[0]), incr_args); + + aspace->insertSnippet(incr_call, *points); + cerr << "TAKE1 H\n"; + app_proc->continueExecution(); + cerr << "TAKE1 I\n"; + sleep(4); + app_proc->detach(true); + + cout << "FIRST MUTATION DONE. MUTATOR IS DOING THE SECOND ONE...\n"; + + sleep(4); + + cerr << "TAKE2 A\n"; + // let's go... + app_proc = bpatch2.processAttach(NULL, pid); + cerr << "TAKE2 B\n"; + aspace = app_proc; + cerr << "TAKE2 C\n"; + image = aspace->getImage(); + cerr << "TAKE2 D\n"; + +/* BPatch_Set access_types; + access_types.insert(BPatch_opLoad); + access_types.insert(BPatch_opStore); +*/ + vector functions2, incr_functions2; + vector *points2;; + image->findFunction("function_name", functions2); + cerr << "TAKE2 E\n"; + points2 = functions2[0]->findPoint(BPatch_exit); + cerr << "TAKE2 F\n"; + + // create snippet + image->findFunction("incr2", incr_functions2); + cerr << "TAKE2 G\n"; + vector incr_args2; + BPatch_funcCallExpr incr_call2(*(incr_functions2[0]), incr_args2); + + aspace->insertSnippet(incr_call2, *points2); + cerr << "TAKE2 H\n"; + app_proc->continueExecution(); + cerr << "TAKE2 I\n"; + app_proc->detach(true); + + cout << "SECOND MUTATION DONE. MUTATOR IS GOING...\n"; + + return 0; +} diff --git a/tests/Sanity/smoke-test/dynamic/Makefile b/tests/Sanity/smoke-test/dynamic/Makefile new file mode 100644 index 0000000..aaecdd6 --- /dev/null +++ b/tests/Sanity/smoke-test/dynamic/Makefile @@ -0,0 +1,17 @@ +CPP=g++ +#DYNINST_ROOT=/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst +##LINK=-L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst -L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst/lib -ldyninstAPI -ldynC -ldl +#LINK=-L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst -L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst/lib -ldyninstAPI -ldl +#INCLUDE=-I/opt/rh/devtoolset-2/root/usr/include/dyninst +LINK2=-ldyninstAPI -ldl -lboost_system + +all: mutatee mutator + +clean: + rm mutatee mutator + +mutatee: mutatee.cpp + $(CPP) -g -o mutatee mutatee.cpp + +mutator: mutator.cpp + $(CPP) -g -o mutator $(INCLUDE) $(LINK) $(LINK2) mutator.cpp diff --git a/tests/Sanity/smoke-test/dynamic/load_env.sh b/tests/Sanity/smoke-test/dynamic/load_env.sh new file mode 100644 index 0000000..ce686f0 --- /dev/null +++ b/tests/Sanity/smoke-test/dynamic/load_env.sh @@ -0,0 +1,6 @@ +DYNINSTAPI_RT_LIB=/opt/rh/devtoolset-3/root/usr/lib64/dyninst/libdyninstAPI_RT.so +export DYNINSTAPI_RT_LIB +if [[ ! $LD_LIBRARY_PATH =~ .*dyninst.* ]]; then + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LD_LIBRARY_PATH/dyninst +fi +export LD_LIBRARY_PATH diff --git a/tests/Sanity/smoke-test/dynamic/mutatee.cpp b/tests/Sanity/smoke-test/dynamic/mutatee.cpp new file mode 100644 index 0000000..111b0ab --- /dev/null +++ b/tests/Sanity/smoke-test/dynamic/mutatee.cpp @@ -0,0 +1,44 @@ +#include +#include +#include + +using namespace std; + +int a = 0; + +void incr(void) +{ + a++; +} + +int function_name(void) +{ + fprintf(stderr, "FUNCTION EXECUTED. VALUE = %i\n", a); +} + +int main(int argc, char **argv) +{ + int n = 10, i; + FILE *f = fopen("RESULT.log", "w"); + if(argc > 1) + { + if((n = atoi(argv[1])) <= 0) + n = 10; + } + else + n = 10; + + for(i = 0; i < n; i++) + { + function_name(); + sleep(3); + } + + if(a) + fprintf(f, "MUTATION OK.\n"); + else + fprintf(f, "MUTATION FAILED.\n"); + + fclose(f); + return !a; +} diff --git a/tests/Sanity/smoke-test/dynamic/mutator.cpp b/tests/Sanity/smoke-test/dynamic/mutator.cpp new file mode 100644 index 0000000..ed540f2 --- /dev/null +++ b/tests/Sanity/smoke-test/dynamic/mutator.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include + +// dyninst libraries + +#include "BPatch.h" +#include "BPatch_addressSpace.h" +#include "BPatch_process.h" +#include "BPatch_function.h" +#include "BPatch_point.h" +//#include "BPatch_flowGraph.h" + +using namespace std; + + +BPatch bpatch; + + +int main(int argc, char **argv) +{ + int pid; + BPatch_process *app_proc; + BPatch_addressSpace *aspace; + BPatch_image *image; + + // check the options + if(argc != 2) + { + cerr << "ERROR ## Missing command line args. Use PID of the process you want to attach.\n"; + return 1; + } + + pid = atoi(argv[1]); + if(pid == 0) + { + cerr << "ERROR ## Wrong PID " << pid << ", please use another.\n"; + return 2; + } + + // let's go... + app_proc = bpatch.processAttach(NULL, pid); + aspace = app_proc; + image = aspace->getImage(); + +/* BPatch_Set access_types; + access_types.insert(BPatch_opLoad); + access_types.insert(BPatch_opStore); +*/ + vector functions, incr_functions; + vector *points; + image->findFunction("function_name", functions); + points = functions[0]->findPoint(BPatch_entry); + + // create snippet + image->findFunction("incr", incr_functions); + vector incr_args; + BPatch_funcCallExpr incr_call(*(incr_functions[0]), incr_args); + + aspace->insertSnippet(incr_call, *points); + app_proc->continueExecution(); +#ifdef __PPC__ + // PPC detach removes snippets, so wait + bpatch.waitForStatusChange(); +#endif + app_proc->detach(true); + + cout << "MUTATION DONE. MUTATOR IS GOING...\n"; + + return 0; +} diff --git a/tests/Sanity/smoke-test/main.fmf b/tests/Sanity/smoke-test/main.fmf new file mode 100644 index 0000000..0670d38 --- /dev/null +++ b/tests/Sanity/smoke-test/main.fmf @@ -0,0 +1,16 @@ +summary: The test does basic instrumentation on binaries. +description: '' +contact: +- Michael Petlan +component: +- dyninst +test: ./runtest.sh +framework: beakerlib +recommend: +- dyninst +- dyninst-devel +- gcc +- gcc-c++ +duration: 12m +extra-summary: /tools/dyninst/Sanity/smoke-test +extra-task: /tools/dyninst/Sanity/smoke-test diff --git a/tests/Sanity/smoke-test/runtest.sh b/tests/Sanity/smoke-test/runtest.sh new file mode 100755 index 0000000..88792a4 --- /dev/null +++ b/tests/Sanity/smoke-test/runtest.sh @@ -0,0 +1,207 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/dyninst/Sanity/smoke-test +# Description: The test does basic instrumentation on binaries. +# Author: Michael Petlan +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# 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, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="dyninst" + +rlJournalStart + rlPhaseStartSetup + rlRun "TMPD=$(mktemp -d)" + rlRun "cp -r dynamic dynamic-double static $TMPD/" + rlRun "pushd $TMPD" + # load the proper environment - set the variables + # When using dyninst, we have to have LD_LIBRARY_PATH set to dyninst's directory + # and DYNINSTAPI_RT_LIB should keep the path of libdyninstAPI_RT.so.8.0 shared library. + # After having this set properly, an application what uses dyninst, can be compiled and run. + + test -e "/usr/lib64" && BITS="64" || BITS="" + ARCH=`rlGetPrimaryArch` + + rlAssertRpm $PACKAGE + DYNINST_ROOT="/usr/lib$BITS/dyninst" + INCLUDE="-I/usr/include/dyninst" + LINK="-L/usr/lib$BITS/dyninst -L/usr/lib$BITS/dyninst/lib" + echo $LD_LIBRARY_PATH | grep "$DYNINST_ROOT" + if [ $? -ne 0 ]; then + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DYNINST_ROOT" + fi + + # the API runtime library path should be available from rpmquery + if [ `rpmquery -l $PACKAGE.$ARCH | grep API_RT | wc -l` -eq 1 ]; then + # if there's only one file, we may accept that + DYNINSTAPI_RT_LIB=`rpmquery -l $PACKAGE.$ARCH | grep API_RT` + else + # sometimes there're many links to the API_RT lib, so we have to choose the proper file + for rtlib in `rpmquery -l $PACKAGE.$ARCH | grep API_RT`; do + test -L $rtlib || DYNINSTAPI_RT_LIB="$rtlib" + done + fi + export DYNINSTAPI_RT_LIB + if [[ ! $LD_LIBRARY_PATH =~ .*dyninst.* ]]; then + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LD_LIBRARY_PATH/dyninst + fi + export LD_LIBRARY_PATH + + # compile both static and dynamic test + for TC in static dynamic dynamic-double; do + cd $TC + rlRun "make BITS=\"$BITS\" DYNINST_ROOT=\"$DYNINST_ROOT\" INCLUDE=\"$INCLUDE\" LINK=\"$LINK\"" 0 "Compiling $TC dyninst example." + cd .. + done + + # IMPORTANT: We have to make sure, that some SELinux bools are set right (see dyninst docs) + # + # We need: + # allow_execmod --> on + # allow_execstack --> on + # deny_ptrace --> off + # + # Note: The bool deny_ptrace is not present in RHEL yet. + # + SELINUX_STATUS=`sestatus | grep "SELinux status" | awk '{ print $3; }'` + if [[ "$SELINUX_STATUS" == "enabled" ]]; then + rlLog "SELINUX IS ENABLED." + SEBOOL_ALLOW_EXECMOD=`getsebool allow_execmod` + SEBOOL_ALLOW_EXECSTACK=`getsebool allow_execstack` + SEBOOL_DENY_PTRACE=`getsebool deny_ptrace` + if [[ "$SEBOOL_ALLOW_EXECMOD" =~ "> off" ]]; then + rlLog "SELINUX: We need to set allow_execmod to on." + setsebool allow_execmod on + SEBOOL_ALLOW_EXECMOD="off" + else + rlLog "SELINUX: $SEBOOL_ALLOW_EXECMOD -- already OK." + fi + if [[ "$SEBOOL_ALLOW_EXECSTACK" =~ "> off" ]]; then + rlLog "SELINUX: We need to set allow_execstack to on." + setsebool allow_execstack on + SEBOOL_ALLOW_EXECSTACK="off" + else + rlLog "SELINUX: $SEBOOL_ALLOW_EXECSTACK -- already OK." + fi + if [[ "$SEBOOL_DENY_PTRACE" =~ "> on" ]]; then + rlLog "SELINUX: We need to set deny_ptrace to off." + setsebool deny_ptrace off + SEBOOL_DENY_PTRACE="on" + else + if [ -z "$SEBOOL_DENY_PTRACE" ]; then + rlLog "SELINUX: deny_ptrace does not exist -- OK." + else + rlLog "SELINUX: $SEBOOL_DENY_PTRACE -- already OK." + fi + fi + else + rlLog "SELINUX IS DISABLED. We do not have to change anything." + fi + + # Checking for lahf instruction support (bz1134843 workaround) + ARCH=`uname -i` + if [[ "$ARCH" =~ "86" ]]; then + IS_LAHF_SUPPORTED=`cat /proc/cpuinfo | grep lahf` + if [ -z "$IS_LAHF_SUPPORTED" ]; then + rlLogWarning "The CPU does not support needed LAHF instruction." + fi + fi + rlPhaseEnd + + rlPhaseStartTest "Testing static instrumentation" + cd static + rlRun "./mutator" + rlAssertExists "mutated" + RESULT=`./mutated` + if [[ "$RESULT" == "MUTATION OK." ]]; then + rlPass "Instrumentation PASSed." + else + rlFail "Instrumentation FAILed." + fi + cd .. + rlPhaseEnd + + rlPhaseStartTest "Testing dynamic instrumentation" + cd dynamic + ./mutatee 10 & + PID=$! + # export DYNINST_DEBUG_STARTUP=1 + # export DYNINST_DEBUG_RTLIB=1 + # export DYNINST_DEBUG_CRASH=1 + # export DYNINST_DEBUG_BPATCH=1 + ./mutator $PID + sleep 50 + RESULT=`cat RESULT.log` + if [[ "$RESULT" == "MUTATION OK." ]]; then + rlPass "Instrumentation PASSed." + else + rlFail "Instrumentation FAILed." + fi + cd .. + rlPhaseEnd + + rlPhaseStartTest "Testing dynamic double instrumentation" + # This case needs to have the DYNINSTAPI_RT_LIB variable pointing to a regular file + # not to symlink. So it has to be hacked a little + export DYNINSTAPI_RT_LIB=`readlink -fn $DYNINSTAPI_RT_LIB` + + cd dynamic-double + ./mutatee 10 & + PID=$! + # export DYNINST_DEBUG_STARTUP=1 + # export DYNINST_DEBUG_RTLIB=1 + # export DYNINST_DEBUG_CRASH=1 + # export DYNINST_DEBUG_BPATCH=1 + ./mutator $PID + sleep 50 + RESULT=`cat RESULT.log` + if [[ "$RESULT" == "MUTATION OK." ]]; then + rlPass "Instrumentation PASSed." + else + rlFail "Instrumentation FAILed." + fi + cd .. + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPD" + + # restore the SELinux bools, if they were changed + if [[ "$SEBOOL_ALLOW_EXECMOD" == "off" ]]; then + rlLog "Restoring SELinux bool allow_execmod to $SEBOOL_ALLOW_EXECMOD." + setsebool allow_execmod $SEBOOL_ALLOW_EXECMOD + fi + if [[ "$SEBOOL_ALLOW_EXECSTACK" == "off" ]]; then + rlLog "Restoring SELinux bool allow_execstack to $SEBOOL_ALLOW_EXECSTACK." + setsebool allow_execstack $SEBOOL_ALLOW_EXECSTACK + fi + if [[ "$SEBOOL_DENY_PTRACE" == "on" ]]; then + rlLog "Restoring SELinux bool deny_ptrace to $SEBOOL_DENY_PTRACE." + setsebool deny_ptrace $SEBOOL_DENY_PTRACE + fi + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Sanity/smoke-test/static/Makefile b/tests/Sanity/smoke-test/static/Makefile new file mode 100644 index 0000000..2277c20 --- /dev/null +++ b/tests/Sanity/smoke-test/static/Makefile @@ -0,0 +1,17 @@ +CPP=g++ +#DYNINST_ROOT=/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst +##LINK=-L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst -L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst/lib -ldyninstAPI -ldynC -ldl +#LINK=-L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst -L/opt/rh/devtoolset-2/root/usr/lib$(BITS)/dyninst/lib -ldyninstAPI -ldl +#INCLUDE=-I/opt/rh/devtoolset-2/root/usr/include/dyninst +LINK2=-ldyninstAPI -ldl -lboost_system + +all: mutatee mutator + +clean: + rm mutatee mutator mutated + +mutatee: mutatee.cpp + $(CPP) -g -o mutatee mutatee.cpp + +mutator: mutator.cpp + $(CPP) -g -o mutator $(INCLUDE) $(LINK) $(LINK2) mutator.cpp diff --git a/tests/Sanity/smoke-test/static/load_env.sh b/tests/Sanity/smoke-test/static/load_env.sh new file mode 100644 index 0000000..ce686f0 --- /dev/null +++ b/tests/Sanity/smoke-test/static/load_env.sh @@ -0,0 +1,6 @@ +DYNINSTAPI_RT_LIB=/opt/rh/devtoolset-3/root/usr/lib64/dyninst/libdyninstAPI_RT.so +export DYNINSTAPI_RT_LIB +if [[ ! $LD_LIBRARY_PATH =~ .*dyninst.* ]]; then + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LD_LIBRARY_PATH/dyninst +fi +export LD_LIBRARY_PATH diff --git a/tests/Sanity/smoke-test/static/mutatee.cpp b/tests/Sanity/smoke-test/static/mutatee.cpp new file mode 100644 index 0000000..6c3b215 --- /dev/null +++ b/tests/Sanity/smoke-test/static/mutatee.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +using namespace std; + +int a = 0; + +void incr(void) +{ + a++; +} + +int function_name(void) +{ + int i; + + sleep(3); + + if(a) + printf("MUTATION OK.\n"); + else + printf("MUTATION FAILED.\n"); + + return a; +} + +int main(int argc, char **argv) +{ + function_name(); +} diff --git a/tests/Sanity/smoke-test/static/mutator.cpp b/tests/Sanity/smoke-test/static/mutator.cpp new file mode 100644 index 0000000..e7358db --- /dev/null +++ b/tests/Sanity/smoke-test/static/mutator.cpp @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include + +// dyninst libraries + +#include "BPatch.h" +#include "BPatch_addressSpace.h" +#include "BPatch_process.h" +#include "BPatch_function.h" +#include "BPatch_point.h" +//#include "BPatch_flowGraph.h" + +using namespace std; + + +BPatch bpatch; + + +int main(int argc, char **argv) +{ + int pid; + BPatch_binaryEdit *app_bin; + BPatch_addressSpace *aspace; + BPatch_image *image; + +/* // check the options + if(argc != 2) + { + cerr << "ERROR ## Missing command line args. Use PID of the process you want to attach.\n"; + return 1; + } + + pid = atoi(argv[1]); + if(pid == 0) + { + cerr << "ERROR ## Wrong PID " << pid << ", please use another.\n"; + return 2; + } +*/ + // let's go... + app_bin = bpatch.openBinary("mutatee"); + aspace = app_bin; + image = aspace->getImage(); + +/* BPatch_Set access_types; + access_types.insert(BPatch_opLoad); + access_types.insert(BPatch_opStore); +*/ + vector functions, incr_functions; + vector *points; + image->findFunction("function_name", functions); + points = functions[0]->findPoint(BPatch_entry); + + // create snippet + image->findFunction("incr", incr_functions); + vector incr_args; + BPatch_funcCallExpr incr_call(*(incr_functions[0]), incr_args); + + aspace->insertSnippet(incr_call, *points); + app_bin->writeFile("mutated"); + + + cout << "MUTATION DONE. MUTATOR IS GOING...\n"; + + return 0; +} diff --git a/tests/Sanity/testsuite/main.fmf b/tests/Sanity/testsuite/main.fmf new file mode 100644 index 0000000..63be86c --- /dev/null +++ b/tests/Sanity/testsuite/main.fmf @@ -0,0 +1,19 @@ +summary: Dyninst upstream testsuite wrapper +description: '' +contact: Martin Cermak +component: +- dyninst +test: ./runtest.sh +framework: beakerlib +recommend: +- dyninst +- dyninst-devel +- dyninst-testsuite +- boost +- boost-devel +- elfutils-libelf-devel +- libdwarf-devel +- gcc-c++ +duration: 360m +extra-summary: /tools/dyninst/Sanity/testsuite +extra-task: /tools/dyninst/Sanity/testsuite diff --git a/tests/Sanity/testsuite/runtest.sh b/tests/Sanity/testsuite/runtest.sh new file mode 100755 index 0000000..cc7aeea --- /dev/null +++ b/tests/Sanity/testsuite/runtest.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/dyninst/Sanity/testsuite +# Description: Basic functionality covering testsuite +# Author: Michael Petlan +# Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# 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, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE=${PACKAGE:-dyninst} +TESTDIR=${TESTDIR:-/usr/lib64/dyninst/testsuite} + +# Tests known to fail +SKIPLIST=test_thread_2,pc_thread,pc_tls,test_reloc,test_thread_3,\ +test_thread_5,test_thread_6,test_thread_8 + + +rlJournalStart + rlPhaseStartSetup + rlRun "rpm -q $PACKAGE $PACKAGE-testsuite" + + DYNINSTAPI_RT_LIB=$(rpm -ql $PACKAGE | fgrep libdyninstAPI_RT.so | sort | tail -1) + + LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$TESTDIR" + LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(dirname $DYNINSTAPI_RT_LIB)" + LD_LIBRARY_PATH=${LD_LIBRARY_PATH#:} + + export DYNINSTAPI_RT_LIB + export LD_LIBRARY_PATH + + rlRun "setsebool allow_execmod on" + rlRun "setsebool allow_execstack on" + rlRun "setsebool deny_ptrace off" + + rlRun "pushd $TESTDIR" + rlPhaseEnd + + rlPhaseStartTest + rlRun "./runTests -v++ -allmode -allcompilers -allopt -exclude $SKIPLIST" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/testsuite-10.1.0-386.patch b/testsuite-10.1.0-386.patch deleted file mode 100644 index 38dcd3a..0000000 --- a/testsuite-10.1.0-386.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- dyninst-10.1.0/testsuite-10.1.0/src/instruction/test_instruction_farcall.C -+++ dyninst-10.1.0/testsuite-10.1.0/src/instruction/test_instruction_farcall.C -@@ -96,21 +96,21 @@ test_results_t test_instruction_farcall_Mutator::executeTest() - if(decodedInsns.size() != expectedInsns) // six valid, one invalid - { - logerror("FAILED: Expected %d instructions, decoded %d\n", expectedInsns, decodedInsns.size()); -- for(std::vector::iterator curInsn = decodedInsns.begin(); -+ for(std::vector::iterator curInsn = decodedInsns.begin(); - curInsn != decodedInsns.end(); - ++curInsn) - { -- logerror("\t%s\t", (*curInsn)->format().c_str()); -- for(unsigned j = 0; j < (*curInsn)->size(); ++j) -+ logerror("\t%s\t", (*curInsn).format().c_str()); -+ for(unsigned j = 0; j < (*curInsn).size(); ++j) - { -- logerror("%x ", (*curInsn)->rawByte(j)); -+ logerror("%x ", (*curInsn).rawByte(j)); - } - logerror("\n"); - } - - return FAILED; - } -- if(decodedInsns.back() && decodedInsns.back()->isValid()) -+ if(decodedInsns.size() > 0 && decodedInsns.back().isValid()) - { - logerror("FAILED: Expected instructions to end with an invalid instruction, but they didn't"); - return FAILED; diff --git a/testsuite-10.1.0-gettid.patch b/testsuite-10.1.0-gettid.patch deleted file mode 100644 index 9b75b25..0000000 --- a/testsuite-10.1.0-gettid.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- dyninst-10.1.0/testsuite-10.1.0/src/proccontrol/pcontrol_mutatee_tools.c.orig 2019-05-31 05:20:00.492379706 +0200 -+++ dyninst-10.1.0/testsuite-10.1.0/src/proccontrol/pcontrol_mutatee_tools.c 2019-05-31 05:10:11.354826668 +0200 -@@ -62,9 +62,9 @@ - #if !defined(os_windows_test) - #include - --static unsigned int gettid(){ -- return (unsigned int)pthread_self(); --} -+// static unsigned int gettid(){ -+// return (unsigned int)pthread_self(); -+// } - #endif - - thread_t threads[MAX_POSSIBLE_THREADS]; diff --git a/testsuite-9.3.0-junit-nullptr.patch b/testsuite-9.3.0-junit-nullptr.patch deleted file mode 100644 index 6f055c3..0000000 --- a/testsuite-9.3.0-junit-nullptr.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- testsuite-9.3.0/src/JUnitOutputDriver.cpp.nullptr 2016-12-19 14:55:38.000000000 -0800 -+++ testsuite-9.3.0/src/JUnitOutputDriver.cpp 2017-02-15 11:19:22.628056889 -0800 -@@ -35,7 +35,7 @@ void JUnitOutputDriver::startNewTest(std - { - std::stringstream suitename; - suitename << last_group->modname; -- if(last_group->mutatee != '\0') suitename << "." << last_group->mutatee; -+ if(last_group->mutatee != nullptr) suitename << "." << last_group->mutatee; - log(HUMAN, "\n", - suitename.str().c_str(), group_errors, group_skips, group_tests, group_failures); - log(HUMAN, group_output.str().c_str());