add pkgs pe-parse and pe-util (for peldd binary)

This commit is contained in:
Tony Theodore 2018-03-26 19:35:36 +11:00
parent 063cd91e19
commit 29280b8ba9
3 changed files with 263 additions and 0 deletions

186
src/pe-parse-1-fixes.patch Normal file
View File

@ -0,0 +1,186 @@
This file is part of MXE. See LICENSE.md for licensing information.
Contains ad hoc patches for cross building.
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Tony Theodore <tonyt@logyst.com>
Date: Mon, 26 Mar 2018 18:25:08 +1100
Subject: [PATCH 1/3] mingw-w64 fixes
- `WIN32` is user-defined, `_WIN32` is pre-defined by toolchain[1]
- use gcc options instead of MSVC
- `-fPIC` is redundant on mingw
- don't error on `old-style-cast`
[1] https://msdn.microsoft.com/en-us/library/b0084kay.aspx
diff --git a/cmake/compilation_flags.cmake b/cmake/compilation_flags.cmake
index 1111111..2222222 100644
--- a/cmake/compilation_flags.cmake
+++ b/cmake/compilation_flags.cmake
@@ -1,4 +1,4 @@
-if (WIN32)
+if (MSVC)
list(APPEND DEFAULT_CXX_FLAGS /W4 /analyze)
if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
@@ -13,8 +13,13 @@ else ()
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
+ if (MINGW)
+ list(APPEND DEFAULT_CXX_FLAGS -Wno-error=old-style-cast)
+ else ()
+ list(APPEND DEFAULT_CXX_FLAGS -fPIC)
+ endif ()
+
list(APPEND DEFAULT_CXX_FLAGS
- -fPIC
-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization
-Wformat=2 -Winit-self -Wlong-long -Wmissing-declarations -Wmissing-include-dirs -Wcomment
diff --git a/examples/peaddrconv/CMakeLists.txt b/examples/peaddrconv/CMakeLists.txt
index 1111111..2222222 100644
--- a/examples/peaddrconv/CMakeLists.txt
+++ b/examples/peaddrconv/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.1)
project(peaddrconv)
-if (WIN32)
+if (MSVC)
list(APPEND PEADDRCONV_CXXFLAGS /W4 /analyze)
if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
diff --git a/pe-parser-library/src/buffer.cpp b/pe-parser-library/src/buffer.cpp
index 1111111..2222222 100644
--- a/pe-parser-library/src/buffer.cpp
+++ b/pe-parser-library/src/buffer.cpp
@@ -28,7 +28,7 @@ THE SOFTWARE.
// keep this header above "windows.h" because it contains many types
#include <parser-library/parse.h>
-#ifdef WIN32
+#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#define VC_EXTRALEAN
@@ -76,7 +76,7 @@ extern std::uint32_t err;
extern std::string err_loc;
struct buffer_detail {
-#ifdef WIN32
+#ifdef _WIN32
HANDLE file;
HANDLE sec;
#else
@@ -157,7 +157,7 @@ bool readQword(bounded_buffer *b, std::uint32_t offset, std::uint64_t &out) {
}
bounded_buffer *readFileToFileBuffer(const char *filePath) {
-#ifdef WIN32
+#ifdef _WIN32
HANDLE h = CreateFileA(filePath,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -205,7 +205,7 @@ bounded_buffer *readFileToFileBuffer(const char *filePath) {
p->detail = d;
// only where we have mmap / open / etc
-#ifdef WIN32
+#ifdef _WIN32
p->detail->file = h;
HANDLE hMap = CreateFileMapping(h, nullptr, PAGE_READONLY, 0, 0, nullptr);
@@ -296,7 +296,7 @@ void deleteBuffer(bounded_buffer *b) {
}
if (!b->copy) {
-#ifdef WIN32
+#ifdef _WIN32
UnmapViewOfFile(b->buf);
CloseHandle(b->detail->sec);
CloseHandle(b->detail->file);
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Tony Theodore <tonyt@logyst.com>
Date: Mon, 26 Mar 2018 18:31:58 +1100
Subject: [PATCH 2/3] add option to build shared libs
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1111111..2222222 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,8 +13,10 @@ endif ()
include(cmake/compilation_flags.cmake)
list(APPEND GLOBAL_CXXFLAGS ${DEFAULT_CXX_FLAGS})
+option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF)
add_subdirectory(pe-parser-library)
add_subdirectory(dump-pe)
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
+message(STATUS "Build Shared: ${BUILD_SHARED_LIBS}")
message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
diff --git a/pe-parser-library/CMakeLists.txt b/pe-parser-library/CMakeLists.txt
index 1111111..2222222 100644
--- a/pe-parser-library/CMakeLists.txt
+++ b/pe-parser-library/CMakeLists.txt
@@ -11,10 +11,14 @@ list(APPEND PEPARSERLIB_SOURCEFILES
src/parse.cpp
)
-add_library(${PROJECT_NAME} STATIC ${PEPARSERLIB_SOURCEFILES})
+add_library(${PROJECT_NAME} ${PEPARSERLIB_SOURCEFILES})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_options(${PROJECT_NAME} PRIVATE ${GLOBAL_CXXFLAGS})
-install(TARGETS ${PROJECT_NAME} DESTINATION "lib")
+install(TARGETS ${PROJECT_NAME}
+ RUNTIME DESTINATION "bin"
+ LIBRARY DESTINATION "lib"
+ ARCHIVE DESTINATION "lib"
+)
install(FILES "cmake/peparse-config.cmake" DESTINATION "lib/cmake/peparse")
install(DIRECTORY "include/parser-library" DESTINATION "include")
diff --git a/pe-parser-library/cmake/peparse-config.cmake b/pe-parser-library/cmake/peparse-config.cmake
index 1111111..2222222 100644
--- a/pe-parser-library/cmake/peparse-config.cmake
+++ b/pe-parser-library/cmake/peparse-config.cmake
@@ -1,5 +1,5 @@
find_path(PEPARSE_INCLUDE_DIR "parser-library/parse.h")
-find_library(PEPARSE_LIBRARIES NAMES "libpe-parser-library.a")
+find_library(PEPARSE_LIBRARIES NAMES "libpe-parser-library")
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(libproxy DEFAULT_MSG PEPARSE_INCLUDE_DIR PEPARSE_LIBRARIES)
+find_package_handle_standard_args(peparse DEFAULT_MSG PEPARSE_INCLUDE_DIR PEPARSE_LIBRARIES)
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Tony Theodore <tonyt@logyst.com>
Date: Mon, 26 Mar 2018 18:32:23 +1100
Subject: [PATCH 3/3] add option to disable example
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1111111..2222222 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,9 +14,15 @@ include(cmake/compilation_flags.cmake)
list(APPEND GLOBAL_CXXFLAGS ${DEFAULT_CXX_FLAGS})
option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF)
+option(BUILD_EXAMPLES "Build Examples" ON)
+
add_subdirectory(pe-parser-library)
-add_subdirectory(dump-pe)
+
+if (BUILD_EXAMPLES)
+ add_subdirectory(dump-pe)
+endif ()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Build Shared: ${BUILD_SHARED_LIBS}")
+message(STATUS "Build Examples: ${BUILD_EXAMPLES}")
message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")

29
src/pe-parse.mk Normal file
View File

@ -0,0 +1,29 @@
# This file is part of MXE. See LICENSE.md for licensing information.
PKG := pe-parse
$(PKG)_WEBSITE := https://github.com/trailofbits/pe-parse
$(PKG)_DESCR := Principled, lightweight C/C++ PE parser
$(PKG)_IGNORE :=
$(PKG)_VERSION := 752f526
$(PKG)_CHECKSUM := 0a8733fa5bb7e4a077237c869c55b3e5d185f93c7c7d48664f2ebeead1091b47
$(PKG)_GH_CONF := trailofbits/pe-parse/branches/master
$(PKG)_TARGETS := $(BUILD) $(MXE_TARGETS)
$(PKG)_DEPS := cc
# unpack in pe-util for native and cross build
$(PKG)_DEPS_$(BUILD) :=
$(PKG)_BUILD_$(BUILD) :=
define $(PKG)_BUILD
# build and install the cross-library
cd '$(BUILD_DIR)' && $(TARGET)-cmake '$(SOURCE_DIR)' \
-DBUILD_EXAMPLES=OFF
$(MAKE) -C '$(BUILD_DIR)' -j '$(JOBS)'
$(MAKE) -C '$(BUILD_DIR)' -j 1 install
# test cmake find_package() example
mkdir '$(BUILD_DIR).cmake'
cd '$(BUILD_DIR).cmake' && $(TARGET)-cmake '$(SOURCE_DIR)/examples/peaddrconv'
$(MAKE) -C '$(BUILD_DIR).cmake' -j '$(JOBS)'
$(INSTALL) -m755 '$(BUILD_DIR).cmake/peaddrconv.exe' '$(PREFIX)/$(TARGET)/bin/test-$(PKG).exe'
endef

48
src/pe-util.mk Normal file
View File

@ -0,0 +1,48 @@
# This file is part of MXE. See LICENSE.md for licensing information.
PKG := pe-util
$(PKG)_WEBSITE := https://github.com/gsauthof/pe-util
$(PKG)_DESCR := List shared object dependencies of a portable executable (PE)
$(PKG)_IGNORE :=
$(PKG)_VERSION := 04f9475
$(PKG)_CHECKSUM := d3f9f713fa9af3d43d3a25b803525752ac75353b2da343af0b82a4fcd318b78a
$(PKG)_GH_CONF := gsauthof/pe-util/branches/master
$(PKG)_TARGETS := $(BUILD) $(MXE_TARGETS)
$(PKG)_DEPS := cc boost pe-parse
$(PKG)_DEPS_$(BUILD) := boost cmake pe-parse
define $(PKG)_PRE_CONFIGURE
# expects pe-parse in source tree as git submodule
$(call PREPARE_PKG_SOURCE,pe-parse,$(BUILD_DIR))
rm -rf '$(SOURCE_DIR)/pe-parse'
mv '$(BUILD_DIR)/$(pe-parse_SUBDIR)' '$(SOURCE_DIR)/pe-parse'
endef
define $(PKG)_BUILD
$($(PKG)_PRE_CONFIGURE)
# install peldd.exe - handy utility (even for static)
cd '$(BUILD_DIR)' && $(TARGET)-cmake '$(SOURCE_DIR)'
$(MAKE) -C '$(BUILD_DIR)' -j '$(JOBS)'
$(MAKE) -C '$(BUILD_DIR)' -j 1 install
# install prefixed wrapper with default paths
$(if $(BUILD_SHARED),
(echo '#!/bin/sh'; \
echo 'exec "$(PREFIX)/$(BUILD)/bin/peldd" \
--clear-path \
--path "$(PREFIX)/$(TARGET)/bin" \
"$$@"') \
> '$(PREFIX)/bin/$(TARGET)-peldd'
chmod 0755 '$(PREFIX)/bin/$(TARGET)-peldd'
)
endef
define $(PKG)_BUILD_$(BUILD)
$($(PKG)_PRE_CONFIGURE)
# build and install the binary
cd '$(BUILD_DIR)' && cmake '$(SOURCE_DIR)' \
-DCMAKE_INSTALL_PREFIX='$(PREFIX)/$(TARGET)' \
-DCMAKE_CXX_FLAGS='-I$(PREFIX)/$(TARGET)/include'
$(MAKE) -C '$(BUILD_DIR)' -j '$(JOBS)'
$(MAKE) -C '$(BUILD_DIR)' -j 1 install
endef