Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1623cdd47e |
+139
@@ -0,0 +1,139 @@
|
||||
version: 0.7.{build}
|
||||
image: Visual Studio 2019
|
||||
clone_folder: c:\projects\lief
|
||||
|
||||
configuration: Release
|
||||
|
||||
services:
|
||||
- docker
|
||||
|
||||
platform:
|
||||
- x86
|
||||
- x64
|
||||
|
||||
environment:
|
||||
LIEF_AUTOMATIC_BUILDS_KEY:
|
||||
secure: TT7SXISIifq2/tf02n2ATgPj+Ky4Cjl3Fg44BAfyI4yRa4i87UAQIx5EFeV63+Xv2rhcU7JcMgl+An7QBrV6ofuQ9jxbuw+Gd1GqcCrAIyY=
|
||||
LIEF_AUTOMATIC_BUILDS_IV:
|
||||
secure: /S6Vbt3vEisoC81siFbkqOXQeVnwxLZZPMYp1r79G7h+HFjLlWUZSidxxpsAgHNE
|
||||
SCCACHE_CACHE_SIZE: "750M"
|
||||
SCCACHE_DIR: C:\Users\appveyor\AppData\Local\Mozilla\sccache
|
||||
SCCACHE_ERROR_LOG: C:\projects\sccache.log
|
||||
matrix:
|
||||
# Python 3.6
|
||||
- PYTHON_VERSION: "3.6"
|
||||
PYTHON32_PATH: "C:\\Python36"
|
||||
PYTHON32_INCLUDE: "C:\\Python36\\include"
|
||||
PYTHON32_BINARY: "C:\\Python36\\python.exe"
|
||||
PYTHON32_LIBRARY: "C:\\Python36\\libs\\python36.lib"
|
||||
PYTHON64_PATH: "C:\\Python36-x64"
|
||||
PYTHON64_INCLUDE: "C:\\Python36-x64\\include"
|
||||
PYTHON64_BINARY: "C:\\Python36-x64\\python.exe"
|
||||
PYTHON64_LIBRARY: "C:\\Python36-x64\\libs\\python36.lib"
|
||||
|
||||
# Python 3.7
|
||||
- PYTHON_VERSION: "3.7"
|
||||
PYTHON32_PATH: "C:\\Python37"
|
||||
PYTHON32_INCLUDE: "C:\\Python37\\include"
|
||||
PYTHON32_BINARY: "C:\\Python37\\python.exe"
|
||||
PYTHON32_LIBRARY: "C:\\Python37\\libs\\python37.lib"
|
||||
PYTHON64_PATH: "C:\\Python37-x64"
|
||||
PYTHON64_INCLUDE: "C:\\Python37-x64\\include"
|
||||
PYTHON64_BINARY: "C:\\Python37-x64\\python.exe"
|
||||
PYTHON64_LIBRARY: "C:\\Python37-x64\\libs\\python37.lib"
|
||||
|
||||
# Python 3.8
|
||||
- PYTHON_VERSION: "3.8"
|
||||
PYTHON32_PATH: "C:\\Python38"
|
||||
PYTHON32_INCLUDE: "C:\\Python38\\include"
|
||||
PYTHON32_BINARY: "C:\\Python38\\python.exe"
|
||||
PYTHON32_LIBRARY: "C:\\Python38\\libs\\python38.lib"
|
||||
PYTHON64_PATH: "C:\\Python38-x64"
|
||||
PYTHON64_INCLUDE: "C:\\Python38-x64\\include"
|
||||
PYTHON64_BINARY: "C:\\Python38-x64\\python.exe"
|
||||
PYTHON64_LIBRARY: "C:\\Python38-x64\\libs\\python38.lib"
|
||||
|
||||
# Python 3.9
|
||||
- PYTHON_VERSION: "3.9"
|
||||
PYTHON32_PATH: "C:\\Python39"
|
||||
PYTHON32_INCLUDE: "C:\\Python39\\include"
|
||||
PYTHON32_BINARY: "C:\\Python39\\python.exe"
|
||||
PYTHON32_LIBRARY: "C:\\Python39\\libs\\python39.lib"
|
||||
PYTHON64_PATH: "C:\\Python39-x64"
|
||||
PYTHON64_INCLUDE: "C:\\Python39-x64\\include"
|
||||
PYTHON64_BINARY: "C:\\Python39-x64\\python.exe"
|
||||
PYTHON64_LIBRARY: "C:\\Python39-x64\\libs\\python39.lib"
|
||||
|
||||
cache:
|
||||
- '%SCCACHE_DIR%'
|
||||
|
||||
install:
|
||||
- cmd: choco install sccache
|
||||
- cmd: sccache.exe --start-server
|
||||
- ps: if ($env:PLATFORM -eq "x64") { $env:CMAKE_ARCH = "x64" }
|
||||
|
||||
- ps: if ($env:PLATFORM -eq "x64") { $env:PYTHON_PATH = $env:PYTHON64_PATH }
|
||||
- ps: if ($env:PLATFORM -eq "x64") { $env:PYTHON_INCLUDE = $env:PYTHON64_INCLUDE }
|
||||
- ps: if ($env:PLATFORM -eq "x64") { $env:PYTHON_BINARY = $env:PYTHON64_BINARY }
|
||||
- ps: if ($env:PLATFORM -eq "x64") { $env:PYTHON_LIBRARY = $env:PYTHON64_LIBRARY }
|
||||
|
||||
- ps: if ($env:PLATFORM -eq "x86") { $env:PYTHON_PATH = $env:PYTHON32_PATH }
|
||||
- ps: if ($env:PLATFORM -eq "x86") { $env:PYTHON_INCLUDE = $env:PYTHON32_INCLUDE }
|
||||
- ps: if ($env:PLATFORM -eq "x86") { $env:PYTHON_BINARY = $env:PYTHON32_BINARY }
|
||||
- ps: if ($env:PLATFORM -eq "x86") { $env:PYTHON_LIBRARY = $env:PYTHON32_LIBRARY }
|
||||
- set PATH=%PYTHON_PATH%;%PATH%
|
||||
|
||||
# Upgrade pip
|
||||
- python.exe -m pip install --disable-pip-version-check --user --upgrade pip
|
||||
- python.exe -m pip install --user wheel mako
|
||||
- python.exe -m pip install --upgrade setuptools
|
||||
|
||||
|
||||
build_script:
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
- python.exe .\setup.py --ninja --lief-test build bdist_wheel --skip-build && exit 0 # Ignore warnings...
|
||||
- ps: if ($env:PYTHON_VERSION -eq "3.9") { python.exe .\scripts\windows\package_sdk.py }
|
||||
|
||||
after_build:
|
||||
- ps: Get-Service -Name 'ssh-agent' | Set-Service -StartupType Manual
|
||||
- ps: Start-Service -Name 'ssh-agent'
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
- ps: docker pull liefproject/deploy:latest
|
||||
- ps: |
|
||||
docker run `
|
||||
-v ${PWD}:/src `
|
||||
-e APPVEYOR="true" `
|
||||
-e APPVEYOR_PULL_REQUEST_NUMBER="$env:APPVEYOR_PULL_REQUEST_NUMBER" `
|
||||
-e APPVEYOR_REPO_NAME="$env:APPVEYOR_REPO_NAME" `
|
||||
-e APPVEYOR_REPO_TAG_NAME="$env:APPVEYOR_REPO_TAG_NAME" `
|
||||
-e APPVEYOR_REPO_BRANCH="$env:APPVEYOR_REPO_BRANCH" `
|
||||
-e APPVEYOR_BUILD_FOLDER="$env:APPVEYOR_BUILD_FOLDER" `
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY="$env:LIEF_AUTOMATIC_BUILDS_KEY" `
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV="$env:LIEF_AUTOMATIC_BUILDS_IV" `
|
||||
--rm `
|
||||
liefproject/deploy python3 /src/.github/deploy.py
|
||||
$host.SetShouldExit(0)
|
||||
|
||||
on_finish:
|
||||
- cmd: sccache.exe --stop-server
|
||||
|
||||
artifacts:
|
||||
- path: 'dist\*.whl'
|
||||
name: python-wheel
|
||||
|
||||
- path: 'build\*.zip'
|
||||
name: sdk
|
||||
|
||||
#deploy:
|
||||
# description: "LIEF version $(APPVEYOR_REPO_TAG_NAME)"
|
||||
# provider: GitHub
|
||||
# auth_token:
|
||||
# secure: FU9CGrZ1lm0VDHUZg6zvTL4tidluDvRegVUTehCRo2xgiOv6NZePi7TdSy5CsOdG
|
||||
# artifact: sdk;python-wheel
|
||||
# draft: false
|
||||
# prerelease: false
|
||||
# force_update: true
|
||||
# on:
|
||||
# appveyor_repo_tag: true # deploy on tag push only
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
version: 2.1
|
||||
jobs:
|
||||
build:
|
||||
macos:
|
||||
xcode: 12.3.0
|
||||
steps:
|
||||
- checkout:
|
||||
path: ~/LIEF
|
||||
- restore_cache:
|
||||
keys:
|
||||
- ccache-{{ arch }}-{{ .Branch }}
|
||||
- ccache-{{ arch }}-master
|
||||
- ccache-{{ arch }}
|
||||
- pyenv
|
||||
- run:
|
||||
name: Install pyenv
|
||||
command: |
|
||||
brew install pyenv
|
||||
pyenv root
|
||||
pyenv install --list
|
||||
- run:
|
||||
name: Install ccache
|
||||
command: brew install ccache
|
||||
- run:
|
||||
name: Install ninja
|
||||
command: brew install ninja
|
||||
- run:
|
||||
name: CCache initialization
|
||||
command: |
|
||||
ccache --show-stats
|
||||
ccache --zero-stats
|
||||
ccache --max-size=10.0G
|
||||
ccache --set-config=compiler_check=content
|
||||
- run:
|
||||
name: LIEF build setup
|
||||
command: |
|
||||
export PYTHON_CONFIGURE_OPTS="--enable-shared --enable-unicode=ucs2"
|
||||
pyenv install --skip-existing 3.9.0
|
||||
export PYTHON_BINARY=$(pyenv root)/versions/3.9.0/bin/python3.9
|
||||
$PYTHON_BINARY -m pip install --upgrade pip setuptools wheel
|
||||
$PYTHON_BINARY ./setup.py --ninja --lief-test build bdist_wheel
|
||||
bash scripts/osx/package_sdk.sh
|
||||
- run:
|
||||
name: LIEF deploy
|
||||
command: |
|
||||
export PYTHON_BINARY=$(pyenv root)/versions/3.9.0/bin/python3.9
|
||||
$PYTHON_BINARY -m pip install --upgrade requests mako
|
||||
$PYTHON_BINARY .github/deploy.py
|
||||
- run:
|
||||
name: ccache stats
|
||||
when: always
|
||||
command: |
|
||||
ccache --show-stats
|
||||
- save_cache:
|
||||
key: 'ccache-{{ arch }}-{{ .Branch }}'
|
||||
paths: [ "/home/circleci/.ccache" ]
|
||||
- save_cache:
|
||||
key: 'pyenv'
|
||||
paths: [ "/home/circleci/.pyenv" ]
|
||||
|
||||
|
||||
|
||||
-118
@@ -1,118 +0,0 @@
|
||||
---
|
||||
Language: Cpp
|
||||
BasedOnStyle: LLVM
|
||||
Standard: c++17
|
||||
|
||||
# Column limit
|
||||
ColumnLimit: 83
|
||||
|
||||
# Indentation
|
||||
IndentWidth: 2
|
||||
TabWidth: 2
|
||||
UseTab: Never
|
||||
ContinuationIndentWidth: 4
|
||||
ConstructorInitializerIndentWidth: 2
|
||||
IndentCaseLabels: true
|
||||
IndentCaseBlocks: false
|
||||
IndentPPDirectives: BeforeHash
|
||||
NamespaceIndentation: None
|
||||
IndentWrappedFunctionNames: true
|
||||
IndentAccessModifiers: false
|
||||
|
||||
# Access modifiers at same level as class members
|
||||
AccessModifierOffset: 0
|
||||
|
||||
# Constructor initializers: colon at end of line, each initializer on new line
|
||||
BreakConstructorInitializers: AfterColon
|
||||
PackConstructorInitializers: Never
|
||||
|
||||
# Inheritance
|
||||
BreakInheritanceList: BeforeColon
|
||||
|
||||
# Pointer/Reference alignment: attached to type
|
||||
PointerAlignment: Left
|
||||
ReferenceAlignment: Pointer
|
||||
DerivePointerAlignment: false
|
||||
|
||||
# Spacing
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceBeforeCpp11BracedList: false
|
||||
SpaceInEmptyBlock: false
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterTemplateKeyword: false
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeRangeBasedForLoopColon: true
|
||||
|
||||
# Alignment
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignOperands: Align
|
||||
AlignTrailingComments: true
|
||||
AlignConsecutiveAssignments: None
|
||||
AlignConsecutiveDeclarations: false
|
||||
|
||||
# Short forms
|
||||
AllowShortFunctionsOnASingleLine: Empty
|
||||
AllowShortIfStatementsOnASingleLine: Never
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AllowShortBlocksOnASingleLine: Never
|
||||
AllowShortCaseLabelsOnASingleLine: true
|
||||
AllowShortLambdasOnASingleLine: All
|
||||
AllowShortEnumsOnASingleLine: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowShortCaseExpressionOnASingleLine: true
|
||||
|
||||
# Packing
|
||||
BinPackArguments: true
|
||||
BinPackParameters: true
|
||||
|
||||
# Namespaces
|
||||
CompactNamespaces: false
|
||||
FixNamespaceComments: false
|
||||
|
||||
# Empty lines
|
||||
EmptyLineAfterAccessModifier: Never
|
||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||
MaxEmptyLinesToKeep: 2
|
||||
|
||||
# Ternary operators stay at end of line
|
||||
BreakBeforeTernaryOperators: false
|
||||
|
||||
# Misc
|
||||
Cpp11BracedListStyle: true
|
||||
ReflowComments: true
|
||||
InsertBraces: true
|
||||
InsertNewlineAtEOF: true
|
||||
|
||||
BreakTemplateDeclarations: Yes
|
||||
BreakBeforeCloseBracketBracedList: true
|
||||
BreakBeforeCloseBracketFunction: true
|
||||
BreakBeforeTemplateCloser: true
|
||||
|
||||
EnumTrailingComma: Insert
|
||||
AlignConsecutiveMacros:
|
||||
Enabled: true
|
||||
AcrossEmptyLines: true
|
||||
AcrossComments: true
|
||||
BreakAfterReturnType: ExceptShortType
|
||||
BreakBeforeBraces: Custom
|
||||
BraceWrapping:
|
||||
AfterCaseLabel: true
|
||||
AfterControlStatement: MultiLine
|
||||
|
||||
RemoveEmptyLinesInUnwrappedLines: true
|
||||
RemoveSemicolon: true
|
||||
QualifierAlignment: Left
|
||||
|
||||
|
||||
# Includes - preserve existing order
|
||||
SortIncludes: true
|
||||
SortUsingDeclarations: LexicographicNumeric
|
||||
|
||||
IncludeCategories:
|
||||
- Regex: '^((<|")(spdlog|nanobind|catch2|utf8)/)'
|
||||
Priority: 3
|
||||
- Regex: '<[[:alnum:].]+>'
|
||||
Priority: 4
|
||||
- Regex: '.*'
|
||||
Priority: 1
|
||||
SortPriority: 0
|
||||
@@ -1,4 +0,0 @@
|
||||
api/python/**
|
||||
third-party/**
|
||||
src/runtime/osx/utils.h
|
||||
tests/test_define_conflicts.cpp
|
||||
@@ -1,76 +0,0 @@
|
||||
Checks: [
|
||||
-*,
|
||||
bugprone-*,
|
||||
performance-*,
|
||||
portability-*,
|
||||
cppcoreguidelines-*,
|
||||
misc-*,
|
||||
clang-taidy-*,
|
||||
modernize-*,
|
||||
|
||||
-clang-taidy-avoid-implicit-enum-to-integer-conversion,
|
||||
-clang-taidy-avoid-high-cyclomatic-complexity,
|
||||
|
||||
-modernize-use-trailing-return-type,
|
||||
-modernize-use-nodiscard,
|
||||
-modernize-avoid-c-arrays,
|
||||
|
||||
# `modernize-avoid-c-style-cast` also rejects the functional-style suggested by
|
||||
# `clang-taidy-avoid-static-integer-cast` (caught by -Wold-style-cast though)
|
||||
-modernize-avoid-c-style-cast,
|
||||
|
||||
-modernize-use-ranges,
|
||||
-modernize-use-constraints,
|
||||
-modernize-use-designated-initializers,
|
||||
-modernize-use-integer-sign-comparison,
|
||||
-modernize-use-string-view,
|
||||
|
||||
-bugprone-derived-method-shadowing-base-method,
|
||||
-bugprone-easily-swappable-parameters,
|
||||
-bugprone-macro-parentheses,
|
||||
-bugprone-narrowing-conversions,
|
||||
-bugprone-reserved-identifier,
|
||||
-bugprone-signed-bitwise,
|
||||
-bugprone-signed-char-misuse,
|
||||
-cppcoreguidelines-avoid-c-arrays,
|
||||
-cppcoreguidelines-avoid-const-or-ref-data-members,
|
||||
-cppcoreguidelines-avoid-do-while,
|
||||
-cppcoreguidelines-avoid-magic-numbers,
|
||||
-cppcoreguidelines-explicit-constructor,
|
||||
-cppcoreguidelines-macro-to-enum,
|
||||
-cppcoreguidelines-macro-usage,
|
||||
-cppcoreguidelines-missing-std-forward,
|
||||
-cppcoreguidelines-narrowing-conversions,
|
||||
-cppcoreguidelines-non-private-member-variables-in-classes,
|
||||
-cppcoreguidelines-owning-memory,
|
||||
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
||||
-cppcoreguidelines-pro-bounds-avoid-unchecked-container-access,
|
||||
-cppcoreguidelines-pro-bounds-constant-array-index,
|
||||
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
||||
-cppcoreguidelines-pro-type-const-cast,
|
||||
-cppcoreguidelines-pro-type-reinterpret-cast,
|
||||
-cppcoreguidelines-pro-type-static-cast-downcast,
|
||||
-cppcoreguidelines-pro-type-union-access,
|
||||
-cppcoreguidelines-special-member-functions,
|
||||
-cppcoreguidelines-use-enum-class,
|
||||
-misc-const-correctness,
|
||||
-misc-explicit-constructor,
|
||||
-misc-include-cleaner,
|
||||
-misc-misplaced-const,
|
||||
-misc-no-recursion,
|
||||
-misc-non-private-member-variables-in-classes,
|
||||
-misc-override-with-different-visibility,
|
||||
-misc-static-assert,
|
||||
-misc-use-anonymous-namespace,
|
||||
-misc-use-internal-linkage,
|
||||
-performance-enum-size,
|
||||
-performance-no-int-to-ptr,
|
||||
-portability-avoid-pragma-once,
|
||||
]
|
||||
|
||||
CheckOptions:
|
||||
bugprone-unused-return-value.CheckedReturnTypes: '^::std::error_code$;^::std::error_condition$;^::std::errc$;^::std::expected$;^::LIEF::result$'
|
||||
bugprone-unused-return-value.AllowCastToVoid: true
|
||||
|
||||
HeaderFilterRegex: '.*'
|
||||
ExcludeHeaderFilterRegex: '(builds|build|api/rust/include|utils/ordinals_lookup_tables_std|utils/ordinals_lookup_tables)/*'
|
||||
@@ -1,70 +0,0 @@
|
||||
Documentation:
|
||||
CommentFormat: Doxygen
|
||||
Diagnostics:
|
||||
Includes:
|
||||
IgnoreHeader:
|
||||
- spdlog/fmt/.*
|
||||
- nanobind/stl/.*
|
||||
- third-party/.*
|
||||
ClangTidy:
|
||||
FastCheckFilter: Strict
|
||||
Add: [
|
||||
bugprone-*,
|
||||
performance-*,
|
||||
portability-*,
|
||||
cppcoreguidelines-*,
|
||||
modernize-*,
|
||||
misc-*,
|
||||
clang-taidy-*,
|
||||
]
|
||||
Remove: [
|
||||
bugprone-easily-swappable-parameters,
|
||||
bugprone-narrowing-conversions,
|
||||
bugprone-reserved-identifier,
|
||||
bugprone-signed-char-misuse,
|
||||
cppcoreguidelines-avoid-c-arrays,
|
||||
cppcoreguidelines-avoid-const-or-ref-data-members,
|
||||
cppcoreguidelines-avoid-do-while,
|
||||
cppcoreguidelines-avoid-magic-numbers,
|
||||
cppcoreguidelines-explicit-constructor,
|
||||
cppcoreguidelines-missing-std-forward,
|
||||
cppcoreguidelines-narrowing-conversions,
|
||||
cppcoreguidelines-non-private-member-variables-in-classes,
|
||||
cppcoreguidelines-owning-memory,
|
||||
cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
||||
cppcoreguidelines-pro-bounds-constant-array-index,
|
||||
cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
||||
cppcoreguidelines-pro-type-const-cast,
|
||||
cppcoreguidelines-pro-type-reinterpret-cast,
|
||||
cppcoreguidelines-pro-type-static-cast-downcast,
|
||||
cppcoreguidelines-pro-type-union-access,
|
||||
misc-explicit-constructor,
|
||||
misc-misplaced-const,
|
||||
misc-no-recursion,
|
||||
misc-non-private-member-variables-in-classes,
|
||||
misc-use-anonymous-namespace,
|
||||
misc-use-internal-linkage,
|
||||
misc-static-assert,
|
||||
modernize-avoid-c-arrays,
|
||||
modernize-concat-nested-namespaces,
|
||||
modernize-make-unique,
|
||||
modernize-use-nodiscard,
|
||||
modernize-use-noexcept,
|
||||
modernize-use-trailing-return-type,
|
||||
performance-enum-size,
|
||||
performance-no-int-to-ptr,
|
||||
]
|
||||
---
|
||||
If:
|
||||
PathMatch:
|
||||
- api/rust/include/LIEF/.*
|
||||
CompileFlags:
|
||||
Remove: [-std=gnu++17]
|
||||
Add: [-std=gnu++20]
|
||||
|
||||
---
|
||||
If:
|
||||
PathMatch:
|
||||
- include/LIEF/.*
|
||||
PathExclude:
|
||||
- api/rust/.*
|
||||
-43
@@ -1,43 +0,0 @@
|
||||
[paths]
|
||||
source =
|
||||
tests/
|
||||
|
||||
[run]
|
||||
branch = True
|
||||
relative_files = True
|
||||
omit =
|
||||
*/api/python/*
|
||||
*/tests/utils.py
|
||||
*/tests/conftest.py
|
||||
*/tests/run_pytest.py
|
||||
; Require LIEF extended
|
||||
*/tests/coff/test_disassembler.py
|
||||
*/tests/api/test_demangle.py
|
||||
*/tests/dwarf/*
|
||||
*/tests/objc/*
|
||||
*/tests/assembly/*
|
||||
*/tests/pdb/*
|
||||
*/tests/dyld-shared-cache/*
|
||||
|
||||
[report]
|
||||
; Regexes for lines to exclude from consideration
|
||||
exclude_also =
|
||||
; Don't complain about missing debug-only code:
|
||||
def __repr__
|
||||
if self\.debug
|
||||
|
||||
; Don't complain if tests don't hit defensive assertion code:
|
||||
raise AssertionError
|
||||
raise NotImplementedError
|
||||
raise RuntimeError
|
||||
|
||||
; Don't complain if non-runnable code isn't run:
|
||||
if 0:
|
||||
if __name__ == .__main__.:
|
||||
if lief.__extended__:
|
||||
if stderr:
|
||||
if not file.exists():
|
||||
|
||||
; Don't complain about these markers
|
||||
@pytest\.mark\.lief_extended
|
||||
@pytest\.mark\.slow
|
||||
@@ -0,0 +1 @@
|
||||
build
|
||||
@@ -1 +0,0 @@
|
||||
github: [lief-project]
|
||||
@@ -0,0 +1,25 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: romainthomas
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Environment (please complete the following information):**
|
||||
- System and Version : [e.g. Ubuntu 16.04]
|
||||
- Target format (PE, ELF, Mach-O)
|
||||
- LIEF commit version: ``python -c "import lief;print(lief.__version__)"`` or the one from ``LIEF/config.h``
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
*Please describe what you would like to have in LIEF*.
|
||||
|
||||
**Note: If the feature is not precise or if you want to have feedback first, you can open a [discussion](https://github.com/lief-project/LIEF/discussions).**
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
name: Premium Issue
|
||||
about: You need a fix for the issue with a high priority
|
||||
title: ''
|
||||
labels: Premium
|
||||
assignees: romainthomas
|
||||
|
||||
---
|
||||
|
||||
*Premium issues can be used to get a higher priority resolution for users and companies.*
|
||||
*In return, you need to contribute to the project with an action:*
|
||||
|
||||
- Writing a guest blog post here: https://lief-project.github.io/blog/
|
||||
- Fixing another issue
|
||||
- Sponsoring the issue
|
||||
|
||||
*Premium issues will be highlighted in the changelog and the release blog post with your name/logo*
|
||||
|
||||
----------------------------------
|
||||
|
||||
**Description**
|
||||
|
||||
*Please describe the issue/request that needs to be addressed*
|
||||
|
||||
**Context**
|
||||
|
||||
*Please provide the version of LIEF, the operating system as well as the binaries associated with the issue
|
||||
(it can be sent by email as well)*
|
||||
|
||||
----------------------------------
|
||||
|
||||
|
||||
**Reach out to `issue@lief.re` to discuss about the timeline/contribution.**
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
name: Regular Issue
|
||||
about: You identified a bug or a problem in LIEF
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: romainthomas
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen (if applicable)
|
||||
|
||||
**Environment (please complete the following information):**
|
||||
- System and Version : [e.g. Ubuntu 16.04]
|
||||
- Target format (PE, ELF, Mach-O)
|
||||
- LIEF commit version: ``python -c "import lief;print(lief.__version__)"`` or the one from ``LIEF/config.h``
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
|
||||
**NOTICE**
|
||||
|
||||
If the issue does not contain enough information to be reproduced,
|
||||
it will be flagged as [incomplete](https://github.com/lief-project/LIEF/issues?q=is%3Aissue+is%3Aclosed+label%3AIncomplete)
|
||||
and closed.
|
||||
|
||||
**/NOTICE**
|
||||
@@ -1,10 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<title>Links for lief</title>
|
||||
<body>
|
||||
<h1>Links for lief</h1>
|
||||
% for path, filename in files:
|
||||
<a href="/${path}">${filename}</a><br />
|
||||
% endfor
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,9 +0,0 @@
|
||||
[lief.s3]
|
||||
region = "fr-par"
|
||||
bucket = "lief"
|
||||
endpoint = "https://s3.fr-par.scw.cloud"
|
||||
|
||||
[lief.deploy]
|
||||
branches = ["main", "master", "deploy", "devel"]
|
||||
main-branches = ["main", "master"]
|
||||
default-dir = "latest"
|
||||
+362
-264
@@ -1,309 +1,407 @@
|
||||
#!/usr/bin/env python3
|
||||
from botocore.exceptions import ClientError
|
||||
from mako.template import Template
|
||||
from pathlib import Path
|
||||
from typing import Any, Optional
|
||||
|
||||
import argparse
|
||||
import boto3
|
||||
import functools
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import tomli
|
||||
import os
|
||||
import re
|
||||
import logging
|
||||
import pathlib
|
||||
import subprocess
|
||||
import shutil
|
||||
import json
|
||||
from datetime import datetime
|
||||
from mako.template import Template
|
||||
from enum import Enum, auto
|
||||
|
||||
LOG_LEVEL = logging.INFO
|
||||
class CI(Enum):
|
||||
UNKNOWN = auto()
|
||||
TRAVIS = auto()
|
||||
APPVEYOR = auto()
|
||||
GITLAB_CI = auto()
|
||||
CIRCLE_CI = auto()
|
||||
GITHUB_ACTIONS = auto()
|
||||
AZURE = auto()
|
||||
LOCAL = auto()
|
||||
|
||||
CURRENTDIR = Path(__file__).resolve().parent
|
||||
REPODIR = CURRENTDIR.parent
|
||||
ASSET_DIR = CURRENTDIR / "assets"
|
||||
CONFIG_DIR = CURRENTDIR / "config"
|
||||
LIEF_S3_KEY = os.getenv("LIEF_S3_KEY", None)
|
||||
LIEF_S3_SECRET = os.getenv("LIEF_S3_SECRET", None)
|
||||
OWNED_ORGS = ["lief-project/", "romainthomas/"]
|
||||
RELEASE_KEYWORD = ["release-", "release/"]
|
||||
def pretty_ci_name(ci):
|
||||
return str(ci).split(".")[-1].replace("_", "-").lower()
|
||||
|
||||
DEFAULT_CONFIG = CONFIG_DIR / "gh-ci.toml"
|
||||
DEFAULT_TEMPLATE = (ASSET_DIR / "index.j2").read_text()
|
||||
def is_pr(ci):
|
||||
if ci == CI.TRAVIS:
|
||||
cond1 = os.getenv("TRAVIS_EVENT_TYPE", "pull_request") == "pull_request"
|
||||
cond2 = not (os.getenv("TRAVIS_REPO_SLUG", "").startswith("lief-project/") or os.getenv("TRAVIS_REPO_SLUG", "").startswith("romainthomas/LIEF"))
|
||||
return cond1 or cond2
|
||||
elif ci == CI.APPVEYOR:
|
||||
logger.info("%s - %s", os.getenv("APPVEYOR_PULL_REQUEST_NUMBER", -1), os.getenv("APPVEYOR_REPO_NAME", ""))
|
||||
pr_number = os.getenv("APPVEYOR_PULL_REQUEST_NUMBER", "")
|
||||
cond1 = len(pr_number) != 0 and int(pr_number) >= 0
|
||||
cond2 = not (os.getenv("APPVEYOR_REPO_NAME", "").startswith("lief-project/") or os.getenv("APPVEYOR_REPO_NAME", "").startswith("romainthomas/"))
|
||||
return cond1 or cond2
|
||||
elif ci == CI.CIRCLE_CI:
|
||||
cond1 = int(os.getenv("CIRCLE_PR_NUMBER", -1)) >= 0
|
||||
cond2 = os.getenv("CIRCLE_PROJECT_USERNAME", "") != "lief-project" and os.getenv("CIRCLE_PROJECT_USERNAME", "") != "romainthomas"
|
||||
return cond1 or cond2
|
||||
elif ci == CI.GITHUB_ACTIONS:
|
||||
cond1 = os.getenv("GITHUB_HEAD_REF", "") != ""
|
||||
cond2 = not (os.getenv("GITHUB_REPOSITORY", "").startswith("lief-project/") or os.getenv("GITHUB_REPOSITORY", "").startswith("romainthomas/LIEF"))
|
||||
return cond1 or cond2
|
||||
elif ci == CI.LOCAL:
|
||||
return False
|
||||
return True
|
||||
|
||||
def get_branch(ci):
|
||||
if ci == CI.TRAVIS:
|
||||
return os.getenv("TRAVIS_BRANCH")
|
||||
elif ci == CI.APPVEYOR:
|
||||
return os.getenv("APPVEYOR_REPO_BRANCH")
|
||||
elif ci == CI.CIRCLE_CI:
|
||||
return os.getenv("CIRCLE_BRANCH")
|
||||
elif ci == CI.GITHUB_ACTIONS:
|
||||
return os.getenv("GITHUB_REF").replace("refs/heads/", "")
|
||||
elif ci == CI.LOCAL:
|
||||
return os.getenv("CI_BRANCH")
|
||||
return None
|
||||
|
||||
def get_ci_workdir(ci):
|
||||
if ci == CI.CIRCLE_CI:
|
||||
return os.getenv("CIRCLE_WORKING_DIRECTORY")
|
||||
elif ci == CI.TRAVIS:
|
||||
return os.getenv("TRAVIS_BUILD_DIR")
|
||||
elif ci == CI.APPVEYOR:
|
||||
return os.getenv("APPVEYOR_BUILD_FOLDER")
|
||||
elif ci == CI.GITHUB_ACTIONS:
|
||||
return os.getenv("GITHUB_WORKSPACE")
|
||||
elif ci == CI.LOCAL:
|
||||
return os.getenv("CI_WORKING_DIR")
|
||||
else:
|
||||
logger.critical("Unsupported CI to resolve working directory")
|
||||
sys.exit(1)
|
||||
|
||||
def get_tag(ci):
|
||||
if ci == CI.CIRCLE_CI:
|
||||
return os.getenv("CIRCLE_TAG", "")
|
||||
elif ci == CI.TRAVIS:
|
||||
return os.getenv("TRAVIS_TAG", "")
|
||||
elif ci == CI.APPVEYOR:
|
||||
if "APPVEYOR_REPO_TAG_NAME" in os.environ:
|
||||
return os.getenv("APPVEYOR_REPO_TAG_NAME", "")
|
||||
return ""
|
||||
elif ci == CI.GITHUB_ACTIONS:
|
||||
ref = os.getenv("GITHUB_REF", "")
|
||||
logger.info("Github Action tag: {}".format(ref))
|
||||
if ref.startswith("refs/tags/"):
|
||||
return ref.replace("refs/tags/", "")
|
||||
return ""
|
||||
elif ci == CI.LOCAL:
|
||||
return os.getenv("CI_TAG")
|
||||
else:
|
||||
logger.critical("Unsupported CI to resolve working directory")
|
||||
sys.exit(1)
|
||||
|
||||
LOG_LEVEL = logging.DEBUG
|
||||
|
||||
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
|
||||
logging.getLogger().setLevel(LOG_LEVEL)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
if LIEF_S3_KEY is None or len(LIEF_S3_KEY) == 0:
|
||||
logger.error("LIEF_S3_KEY is not set!")
|
||||
CURRENT_CI = CI.UNKNOWN
|
||||
|
||||
if LIEF_S3_SECRET is None or len(LIEF_S3_SECRET) == 0:
|
||||
logger.error("LIEF_S3_SECRET is not set!")
|
||||
# Detect CI
|
||||
# ===========================================
|
||||
if os.getenv("TRAVIS", None) is not None:
|
||||
CURRENT_CI = CI.TRAVIS
|
||||
elif os.getenv("APPVEYOR", None) is not None:
|
||||
CURRENT_CI = CI.APPVEYOR
|
||||
elif os.getenv("GITHUB_ACTIONS", None) is not None:
|
||||
CURRENT_CI = CI.GITHUB_ACTIONS
|
||||
elif os.getenv("GITLAB_CI", None) is not None:
|
||||
CURRENT_CI = CI.GITLAB_CI
|
||||
elif os.getenv("CI_LOCAL", "") == "true":
|
||||
CURRENT_CI = CI.LOCAL
|
||||
else:
|
||||
logger.error("Can't detect CI!")
|
||||
sys.exit(1)
|
||||
# TODO(romain): Azure
|
||||
|
||||
class S3Manager:
|
||||
def __init__(self, dirname: str, bucket: str,
|
||||
region: str, endpoint: str,
|
||||
dry_run: bool = False):
|
||||
self._s3_dirname: str = dirname
|
||||
self._s3_bucket: str = bucket
|
||||
self._s3_region: str = region
|
||||
self._s3_endpoint: str = endpoint
|
||||
self._dry_run: bool = dry_run
|
||||
CI_PRETTY_NAME = pretty_ci_name(CURRENT_CI)
|
||||
logger.info("CI: %s", CI_PRETTY_NAME)
|
||||
|
||||
logger.info("[S3] Bucket : %s", self._s3_bucket)
|
||||
logger.info("[S3] Region : %s", self._s3_region)
|
||||
logger.info("[S3] Endpoint: %s", self._s3_endpoint)
|
||||
logger.info("[S3] Dir : %s", self._s3_dirname)
|
||||
ALLOWED_BRANCHES = {"master", "deploy", "devel"}
|
||||
BRANCH_NAME = get_branch(CURRENT_CI)
|
||||
TAG_NAME = get_tag(CURRENT_CI)
|
||||
IS_TAGGED = TAG_NAME is not None and len(TAG_NAME) > 0
|
||||
logger.info("Branch: %s", BRANCH_NAME)
|
||||
logger.info("Tag: %s", TAG_NAME)
|
||||
if BRANCH_NAME not in ALLOWED_BRANCHES and not IS_TAGGED:
|
||||
logger.info("Skip deployment for branch '%s'", BRANCH_NAME)
|
||||
sys.exit(0)
|
||||
|
||||
def change_dir(self, dirname: str):
|
||||
self._s3_dirname = dirname
|
||||
if is_pr(CURRENT_CI):
|
||||
logger.info("Skip pull request")
|
||||
sys.exit(0)
|
||||
|
||||
@property
|
||||
def s3_lief_sdk(self) -> str:
|
||||
return f"{self._s3_dirname}/sdk"
|
||||
CURRENTDIR = pathlib.Path(__file__).resolve().parent
|
||||
REPODIR = CURRENTDIR.parent
|
||||
|
||||
@property
|
||||
def s3_lief_wheel(self) -> str:
|
||||
return f"{self._s3_dirname}/lief"
|
||||
DEPLOY_KEY = os.getenv("LIEF_AUTOMATIC_BUILDS_KEY", None)
|
||||
DEPLOY_IV = os.getenv("LIEF_AUTOMATIC_BUILDS_IV", None)
|
||||
|
||||
@property
|
||||
def url(self):
|
||||
return f"https://{self._s3_bucket}.s3-website.{self._s3_region}.scw.cloud/{self._s3_dirname}"
|
||||
if DEPLOY_KEY is None or len(DEPLOY_KEY) == 0:
|
||||
logger.error("Deploy key is not set!")
|
||||
sys.exit(1)
|
||||
|
||||
@functools.lru_cache(maxsize=1)
|
||||
def s3(self) -> boto3.Session:
|
||||
s3_res = boto3.resource(
|
||||
's3',
|
||||
region_name=self._s3_region,
|
||||
use_ssl=True,
|
||||
endpoint_url=self._s3_endpoint,
|
||||
aws_access_key_id=LIEF_S3_KEY,
|
||||
aws_secret_access_key=LIEF_S3_SECRET
|
||||
)
|
||||
return s3_res
|
||||
if DEPLOY_IV is None or len(DEPLOY_IV) == 0:
|
||||
logger.error("Deploy IV is not set!")
|
||||
sys.exit(1)
|
||||
|
||||
@classmethod
|
||||
def from_config(cls, config):
|
||||
pass
|
||||
GIT_USER = "lief-{}-ci".format(CI_PRETTY_NAME)
|
||||
GIT_EMAIL = "lief@quarkslab.com"
|
||||
|
||||
def _s3_push(self, file: Path, dst: str):
|
||||
logger.info("Uploading %s to %s", file, dst)
|
||||
try:
|
||||
obj = self.s3().Object(self._s3_bucket, dst)
|
||||
if not self._dry_run:
|
||||
obj.put(Body=file.read_bytes())
|
||||
else:
|
||||
logger.info("[--] put: %s/%s - %s", self._s3_bucket, dst, file.as_posix())
|
||||
return 0
|
||||
except ClientError as e:
|
||||
logger.error("S3 push failed: %s", e)
|
||||
return 1
|
||||
CI_CWD = pathlib.Path(get_ci_workdir(CURRENT_CI))
|
||||
|
||||
def push_wheel(self, file: str):
|
||||
wheel_file = Path(file)
|
||||
if not wheel_file.is_file():
|
||||
logger.error("'%s' is not a valid file!", wheel_file)
|
||||
return
|
||||
if CI_CWD is None:
|
||||
logger.debug("Can't resolve CI working dir")
|
||||
sys.exit(1)
|
||||
|
||||
dst = f"{self.s3_lief_wheel}/{wheel_file.name}"
|
||||
self._s3_push(wheel_file, dst)
|
||||
|
||||
def push_sdk(self, file: str):
|
||||
sdk_path = Path(file)
|
||||
if not sdk_path.is_file():
|
||||
logger.error("'%s' is not a valid file!", sdk_path)
|
||||
return
|
||||
|
||||
dst = f"{self.s3_lief_sdk}/{sdk_path.name}"
|
||||
self._s3_push(sdk_path, dst)
|
||||
|
||||
def push_content(self, content: str, dst: str):
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
tmp_path = Path(tmp)
|
||||
index = tmp_path / "index.html"
|
||||
index.write_text(content)
|
||||
self._s3_push(index, dst)
|
||||
|
||||
def process_sdk_wheels(self, directory: Path, maxdepth: int = 0,
|
||||
depth: int = 0, recurse: bool = True,
|
||||
skip_sdk: bool = False):
|
||||
logger.info("Processing directory: %s", directory)
|
||||
for item in directory.iterdir():
|
||||
if item.is_dir() and recurse:
|
||||
if 0 < maxdepth < depth:
|
||||
logger.debug("Maximum iteration depth reached")
|
||||
else:
|
||||
self.process_sdk_wheels(item, maxdepth, depth + 1, recurse)
|
||||
elif item.is_file():
|
||||
extension = item.suffix
|
||||
if extension in (".zip", ".gz") and not skip_sdk:
|
||||
logger.info("[SDK ] Uploading '%s'", item.as_posix())
|
||||
self.push_sdk(item.as_posix())
|
||||
elif extension in (".whl", ):
|
||||
logger.info("[WHEEL] Uploading '%s'", item.as_posix())
|
||||
self.push_wheel(item.as_posix())
|
||||
LIEF_PACKAGE_REPO = "https://github.com/lief-project/packages.git"
|
||||
LIEF_PACKAGE_DIR = REPODIR / "deploy-packages"
|
||||
LIEF_PACKAGE_SSH_REPO = "git@github.com:lief-project/packages.git"
|
||||
SDK_PACKAGE_DIR = LIEF_PACKAGE_DIR / "sdk"
|
||||
PYPI_PACKAGE_DIR = LIEF_PACKAGE_DIR / "lief"
|
||||
JSON_PACKAGE = LIEF_PACKAGE_DIR / "packages.json"
|
||||
DIST_DIR = REPODIR / "dist"
|
||||
BUILD_DIR = REPODIR / "build"
|
||||
|
||||
|
||||
def upload_wheels_sdk(self, src_dir: Path, maxdepth: int, skip_sdk: bool):
|
||||
logger.info("Looking for wheels and sdk from: %s", src_dir)
|
||||
self.process_sdk_wheels(src_dir, maxdepth=maxdepth, recurse=True,
|
||||
skip_sdk=skip_sdk)
|
||||
logger.debug("Working directory: %s", CI_CWD)
|
||||
|
||||
wheels_index = self.generate_index(self.s3_lief_wheel,
|
||||
DEFAULT_TEMPLATE,
|
||||
skiplist=("index.html", ))
|
||||
SSH_DIR = pathlib.Path("~/.ssh").expanduser().resolve()
|
||||
PYTHON = shutil.which("python")
|
||||
GIT = shutil.which("git")
|
||||
TAR = shutil.which("tar")
|
||||
OPENSSL = shutil.which("openssl")
|
||||
MV = shutil.which("mv")
|
||||
RM = shutil.which("rm")
|
||||
SSH_AGENT = shutil.which("ssh-agent")
|
||||
SSH_ADD = shutil.which("ssh-add")
|
||||
SSH_KEYSCAN = shutil.which("ssh-keyscan")
|
||||
|
||||
sdk_index = self.generate_index(self.s3_lief_sdk, DEFAULT_TEMPLATE,
|
||||
skiplist=("index.html", ))
|
||||
if DEPLOY_KEY is None:
|
||||
logger.error("Deploy key is not set!")
|
||||
sys.exit(1)
|
||||
|
||||
self.push_content(wheels_index, f"{self.s3_lief_wheel}/index.html")
|
||||
self.push_content(sdk_index, f"{self.s3_lief_sdk}/index.html")
|
||||
|
||||
logger.info("Done!")
|
||||
logger.info("URL: %s/%s", self.url, "sdk")
|
||||
logger.info("URL: %s/%s", self.url, "lief")
|
||||
|
||||
def s3_list(self, dirname: str) -> list[Any]:
|
||||
if self._dry_run:
|
||||
return []
|
||||
return self.s3().Bucket(self._s3_bucket).objects.filter(Prefix=dirname)
|
||||
|
||||
def generate_index(self, dirname: str, template: str, skiplist=None):
|
||||
files = self.s3_list(dirname)
|
||||
selected_files = []
|
||||
for s3_object in files:
|
||||
filename = Path(s3_object.key).name
|
||||
if skiplist is not None and filename in skiplist:
|
||||
continue
|
||||
selected_files.append((s3_object.key, filename))
|
||||
return Template(template).render(files=selected_files)
|
||||
|
||||
class GithubDeploy:
|
||||
def __init__(self, branches: list[str],
|
||||
main_branches: list[str],
|
||||
default_dir: str,
|
||||
s3_manager: S3Manager):
|
||||
self.s3_manager: S3Manager = s3_manager
|
||||
|
||||
self._branches: list[str] = branches
|
||||
self._main_branches: list[str] = main_branches
|
||||
self._default_dir: str = default_dir
|
||||
if DEPLOY_IV is None:
|
||||
logger.error("Deploy IV is not set!")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
@classmethod
|
||||
def from_config(cls, config_file: Path):
|
||||
with open(config_file, "rb") as f:
|
||||
toml_config = tomli.load(f)
|
||||
#####################
|
||||
# Clone package repo
|
||||
#####################
|
||||
target_branch = "gh-pages"
|
||||
|
||||
if "lief" not in toml_config:
|
||||
logger.warning("Missing lief entries in '%s'", config_file)
|
||||
return None
|
||||
lief_conf = toml_config["lief"]
|
||||
if BRANCH_NAME != "master":
|
||||
target_branch = "packages-{}".format(BRANCH_NAME.replace("/", "-").replace("_", "-"))
|
||||
|
||||
if "s3" not in lief_conf:
|
||||
logger.warning("Missing lief.s3 entries in '%s'", config_file)
|
||||
return None
|
||||
if IS_TAGGED:
|
||||
target_branch = str(TAG_NAME)
|
||||
|
||||
if "deploy" not in lief_conf:
|
||||
logger.warning("Missing lief.deploy entries in '%s'", config_file)
|
||||
return None
|
||||
new_branch = False
|
||||
if not LIEF_PACKAGE_DIR.is_dir():
|
||||
cmd = "{} clone --branch={} -j8 --single-branch {} {}".format(GIT, target_branch, LIEF_PACKAGE_REPO, LIEF_PACKAGE_DIR)
|
||||
p = subprocess.Popen(cmd, shell=True, cwd=REPODIR, stderr=subprocess.STDOUT)
|
||||
p.wait()
|
||||
|
||||
branches = lief_conf["deploy"]["branches"]
|
||||
main_branches = lief_conf["deploy"]["main-branches"]
|
||||
default_dir = lief_conf["deploy"]["default-dir"]
|
||||
s3_config = lief_conf["s3"]
|
||||
s3_region = s3_config["region"]
|
||||
s3_bucket = s3_config["bucket"]
|
||||
s3_endpoint = s3_config["endpoint"]
|
||||
if p.returncode:
|
||||
cmd = "{} clone --branch=master -j8 --single-branch {} {}".format(GIT, LIEF_PACKAGE_REPO, LIEF_PACKAGE_DIR)
|
||||
pmaster = subprocess.Popen(cmd, shell=True, cwd=REPODIR, stderr=subprocess.STDOUT)
|
||||
pmaster.wait()
|
||||
if pmaster.returncode:
|
||||
sys.exit(1)
|
||||
new_branch = True
|
||||
|
||||
s3_manager = S3Manager(default_dir, s3_bucket, s3_region, s3_endpoint)
|
||||
return cls(branches, main_branches, default_dir, s3_manager)
|
||||
|
||||
@staticmethod
|
||||
def branch() -> Optional[str]:
|
||||
ref = os.getenv("GITHUB_REF")
|
||||
if ref is None:
|
||||
return None
|
||||
return ref.replace("refs/heads/", "")
|
||||
|
||||
@staticmethod
|
||||
def is_pr() -> bool:
|
||||
head_ref = os.getenv("GITHUB_HEAD_REF", "")
|
||||
repo_path = os.getenv("GITHUB_REPOSITORY", "")
|
||||
is_owned_repo = any(repo_path.startswith(org) for org in OWNED_ORGS)
|
||||
return head_ref != "" or not is_owned_repo
|
||||
|
||||
@staticmethod
|
||||
def is_tagged() -> bool:
|
||||
tag = GithubDeploy.tag_name()
|
||||
return tag is not None and len(tag) > 0
|
||||
|
||||
@staticmethod
|
||||
def tag_name() -> Optional[str]:
|
||||
ref = os.getenv("GITHUB_REF", "")
|
||||
logger.info("Github Action tag: %s", ref)
|
||||
if ref.startswith("refs/tags/"):
|
||||
return ref.replace("refs/tags/", "")
|
||||
return ""
|
||||
|
||||
@staticmethod
|
||||
def workspace() -> str:
|
||||
return os.getenv("GITHUB_WORKSPACE", "")
|
||||
|
||||
def is_main_branch(self, name: str) -> bool:
|
||||
return name in self._main_branches
|
||||
|
||||
def should_be_deployed(self, branch: str) -> bool:
|
||||
if any(re.match(s, branch) for s in self._branches):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def deploy(self, directories: list[str], skip_sdk: bool = False):
|
||||
s3dir = None
|
||||
|
||||
branch = GithubDeploy.branch()
|
||||
|
||||
if branch is None:
|
||||
logger.warning("Can't resolve the branch name")
|
||||
cmd = "{} checkout --orphan {}".format(GIT, target_branch)
|
||||
pmaster = subprocess.Popen(cmd, shell=True, cwd=LIEF_PACKAGE_DIR, stderr=subprocess.STDOUT)
|
||||
pmaster.wait()
|
||||
if pmaster.returncode:
|
||||
sys.exit(1)
|
||||
|
||||
s3dir = self._default_dir
|
||||
cmd = "{} reset --hard".format(GIT)
|
||||
pmaster = subprocess.Popen(cmd, shell=True, cwd=LIEF_PACKAGE_DIR, stderr=subprocess.STDOUT)
|
||||
pmaster.wait()
|
||||
|
||||
if not self.should_be_deployed(branch):
|
||||
logger.info("Skipping deployment for branch: %s", branch)
|
||||
return
|
||||
SDK_PACKAGE_DIR.mkdir(exist_ok=True)
|
||||
PYPI_PACKAGE_DIR.mkdir(exist_ok=True)
|
||||
|
||||
if s3dir is None:
|
||||
logger.error("Target directory is not set")
|
||||
sys.exit(1)
|
||||
packages_info = {}
|
||||
new_packages_info = {}
|
||||
if JSON_PACKAGE.is_file():
|
||||
try:
|
||||
packages_info = json.loads(JSON_PACKAGE.read_bytes())
|
||||
except json.decoder.JSONDecodeError as e:
|
||||
logger.error(e)
|
||||
else:
|
||||
JSON_PACKAGE.touch()
|
||||
|
||||
logger.info("s3dir: %s", s3dir)
|
||||
self.s3_manager.change_dir(s3dir)
|
||||
for dirname in directories:
|
||||
dirpath = Path(dirname).resolve().absolute().expanduser()
|
||||
self.s3_manager.upload_wheels_sdk(dirpath, maxdepth=1,
|
||||
skip_sdk=skip_sdk)
|
||||
logger.info("CI: %s - %s", GIT_USER, GIT_EMAIL)
|
||||
cmds = [
|
||||
"{} config user.name '{}'".format(GIT, GIT_USER),
|
||||
"{} config user.email '{}'".format(GIT, GIT_EMAIL),
|
||||
"{} reset --soft root".format(GIT),
|
||||
"{} ls-files -v".format(GIT),
|
||||
]
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--config", "-c")
|
||||
parser.add_argument("--dry-run", "-n", action="store_true", default=False)
|
||||
parser.add_argument("--skip-sdk", action="store_true", default=False)
|
||||
parser.add_argument("directories", nargs="+")
|
||||
for cmd in cmds:
|
||||
p = subprocess.Popen(cmd, shell=True, cwd=LIEF_PACKAGE_DIR, stderr=subprocess.STDOUT)
|
||||
p.wait()
|
||||
|
||||
args = parser.parse_args()
|
||||
config_path = None
|
||||
if args.config is not None:
|
||||
config_path = Path(args.config)
|
||||
else:
|
||||
config_path = DEFAULT_CONFIG
|
||||
|
||||
if not config_path.is_file():
|
||||
logger.error("'%s' is not a valid config path")
|
||||
if p.returncode:
|
||||
sys.exit(1)
|
||||
|
||||
gh_deploy = GithubDeploy.from_config(config_path)
|
||||
gh_deploy.deploy(args.directories, args.skip_sdk)
|
||||
for file in DIST_DIR.glob("*.whl"):
|
||||
logger.debug("Copying '%s' to '%s'", file.as_posix(), PYPI_PACKAGE_DIR.as_posix())
|
||||
new_packages_info[file.name] = datetime.now().strftime('%Y-%m-%d-%H:%M:%S')
|
||||
shutil.copy(file.as_posix(), PYPI_PACKAGE_DIR.as_posix())
|
||||
|
||||
for file in BUILD_DIR.glob("*.zip"):
|
||||
logger.debug("Copying '%s' to '%s'", file.as_posix(), SDK_PACKAGE_DIR.as_posix())
|
||||
new_packages_info[file.name] = datetime.now().strftime('%Y-%m-%d-%H:%M:%S')
|
||||
shutil.copy(file.as_posix(), SDK_PACKAGE_DIR.as_posix())
|
||||
|
||||
for file in BUILD_DIR.glob("*.tar.gz"):
|
||||
logger.debug("Copying '%s' to '%s'", file.as_posix(), SDK_PACKAGE_DIR.as_posix())
|
||||
new_packages_info[file.name] = datetime.now().strftime('%Y-%m-%d-%H:%M:%S')
|
||||
shutil.copy(file.as_posix(), SDK_PACKAGE_DIR.as_posix())
|
||||
|
||||
for k, v in new_packages_info.items():
|
||||
logger.info("{:<30}: {}".format(k, v))
|
||||
|
||||
try:
|
||||
packages_info.update(new_packages_info)
|
||||
JSON_PACKAGE.write_text(json.dumps(packages_info))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
INDEX_TEMPLATE = r"""
|
||||
<html>
|
||||
<title>Links for lief</title>
|
||||
<body>
|
||||
<h1>Links for lief</h1>
|
||||
% for name in names:
|
||||
<a href="${base_url}/${base}/${name}">${name}</a><br />
|
||||
% endfor
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
EXCLUDED = ['index.html', '.gitkeep']
|
||||
BASE_URL = "https://lief-project.github.io"
|
||||
|
||||
fnames = [fname for fname in sorted(f.name for f in PYPI_PACKAGE_DIR.iterdir() if f.is_file() and f.name not in EXCLUDED)]
|
||||
html = Template(INDEX_TEMPLATE).render(names=fnames, base_url=BASE_URL, base="packages/lief")
|
||||
with open((PYPI_PACKAGE_DIR / "index.html").as_posix(), "w") as f:
|
||||
f.write(html)
|
||||
|
||||
|
||||
fnames = [fname for fname in sorted(f.name for f in SDK_PACKAGE_DIR.iterdir() if f.is_file() and f.name not in EXCLUDED)]
|
||||
html = Template(INDEX_TEMPLATE).render(names=fnames, base_url=BASE_URL, base="packages/sdk")
|
||||
with open((SDK_PACKAGE_DIR / "index.html").as_posix(), "w") as f:
|
||||
f.write(html)
|
||||
|
||||
if not SSH_DIR.is_dir():
|
||||
SSH_DIR.mkdir(mode=0o700)
|
||||
|
||||
#fix_ssh_perms()
|
||||
deploy_key_path = (REPODIR / ".github" / "deploy-key.enc").as_posix()
|
||||
output_key_path = (REPODIR / ".git" / "deploy-key")
|
||||
cmd = "{} aes-256-cbc -K {} -iv {} -in {} -out {} -d".format(
|
||||
OPENSSL, DEPLOY_KEY, DEPLOY_IV, deploy_key_path, output_key_path.as_posix())
|
||||
|
||||
kwargs = {
|
||||
'shell': True,
|
||||
'cwd': REPODIR,
|
||||
'stdout': subprocess.DEVNULL,
|
||||
'stderr': subprocess.DEVNULL,
|
||||
}
|
||||
|
||||
p = subprocess.Popen(cmd, **kwargs)
|
||||
p.wait()
|
||||
|
||||
if p.returncode:
|
||||
sys.exit(1)
|
||||
|
||||
output_key_path.chmod(0o600)
|
||||
logger.info(output_key_path)
|
||||
|
||||
process = subprocess.run(SSH_AGENT, stdout=subprocess.PIPE, universal_newlines=True, stderr=subprocess.STDOUT)
|
||||
OUTPUT_PATTERN = re.compile(r'SSH_AUTH_SOCK=(?P<socket>[^;]+).*SSH_AGENT_PID=(?P<pid>\d+)', re.MULTILINE | re.DOTALL)
|
||||
match = OUTPUT_PATTERN.search(process.stdout)
|
||||
if match is None:
|
||||
logger.error("Can't start ssh-agent")
|
||||
sys.exit(1)
|
||||
|
||||
agent_data = match.groupdict()
|
||||
logger.info(f'ssh agent data: {agent_data!s}')
|
||||
logger.info('Exporting ssh agent environment variables' )
|
||||
|
||||
os.environ['SSH_AUTH_SOCK'] = agent_data['socket']
|
||||
os.environ['SSH_AGENT_PID'] = agent_data['pid']
|
||||
|
||||
process = subprocess.run([SSH_ADD, output_key_path], stderr=subprocess.STDOUT)
|
||||
if process.returncode != 0:
|
||||
raise Exception(f'Failed to add the key: {output_key_path}')
|
||||
known_hosts = (SSH_DIR / "known_hosts").as_posix()
|
||||
cmd = "{} -H github.com >> {}".format(SSH_KEYSCAN, known_hosts)
|
||||
|
||||
kwargs = {
|
||||
'shell': True,
|
||||
'cwd': REPODIR,
|
||||
'stderr': subprocess.STDOUT,
|
||||
}
|
||||
|
||||
p = subprocess.Popen(cmd, **kwargs)
|
||||
p.wait()
|
||||
|
||||
if p.returncode:
|
||||
sys.exit(1)
|
||||
|
||||
commit_msg = 'Automatic deployment by {}'.format(CI_PRETTY_NAME)
|
||||
cmds = [
|
||||
"{} add .".format(GIT),
|
||||
"{} commit -m '{}'".format(GIT, commit_msg),
|
||||
"{} ls-files -v".format(GIT),
|
||||
]
|
||||
|
||||
for cmd in cmds:
|
||||
logger.info("Running %s", cmd)
|
||||
p = subprocess.Popen(cmd, shell=True, cwd=LIEF_PACKAGE_DIR, stderr=subprocess.STDOUT)
|
||||
p.wait()
|
||||
|
||||
if p.returncode:
|
||||
logger.error("Error while running %s", cmd)
|
||||
sys.exit(1)
|
||||
|
||||
for i in range(10):
|
||||
p = subprocess.Popen("{} push --force {} {}".format(GIT, LIEF_PACKAGE_SSH_REPO, target_branch),
|
||||
shell=True, cwd=LIEF_PACKAGE_DIR, stderr=subprocess.STDOUT)
|
||||
p.wait()
|
||||
|
||||
if p.returncode == 0:
|
||||
break
|
||||
|
||||
cmds = [
|
||||
"{} branch -a -v".format(GIT),
|
||||
"{} fetch -v origin {}".format(GIT, target_branch),
|
||||
"{} branch -a -v".format(GIT),
|
||||
"{} rebase -s recursive -X theirs FETCH_HEAD".format(GIT),
|
||||
"{} branch -a -v".format(GIT),
|
||||
]
|
||||
for c in cmds:
|
||||
p = subprocess.Popen(c, shell=True, cwd=LIEF_PACKAGE_DIR, stderr=subprocess.STDOUT)
|
||||
p.wait()
|
||||
else:
|
||||
logger.critical("Can't push file on %s -> %s", LIEF_PACKAGE_SSH_REPO, target_branch)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
output_key_path.unlink()
|
||||
logger.info("Done!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
sys.exit(0)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 137 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 171 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 84 KiB |
@@ -1,7 +0,0 @@
|
||||
setuptools
|
||||
boto3
|
||||
requests
|
||||
twine
|
||||
tomli
|
||||
mako
|
||||
wheel
|
||||
@@ -0,0 +1,138 @@
|
||||
# Launch Docker CI when committing
|
||||
# Inspired from https://medium.com/@zypherman/my-experiences-with-travis-ci-7f5ea26a87c0
|
||||
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
import sys
|
||||
import logging
|
||||
import pprint
|
||||
import os
|
||||
|
||||
LOG_LEVEL = logging.INFO
|
||||
|
||||
logging.getLogger().addHandler(logging.StreamHandler())
|
||||
logging.getLogger().setLevel(LOG_LEVEL)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
AUTH_TOKEN = os.getenv("TRAVIS_TOKEN", sys.argv[1] if len(sys.argv) > 1 else None)
|
||||
|
||||
if not AUTH_TOKEN:
|
||||
logger.error("No token found!")
|
||||
sys.exit(1)
|
||||
|
||||
LIEF_ID = 12579556
|
||||
DOCKER_ID = 15139981
|
||||
|
||||
ENDPOINT = 'https://api.travis-ci.org'
|
||||
|
||||
LIEF = f"{ENDPOINT}/repo/{LIEF_ID}"
|
||||
DOCKER = f"{ENDPOINT}/repo/{DOCKER_ID}"
|
||||
|
||||
DOCKER_ENV_VARS_ENDPOINT = f"{DOCKER}/env_vars"
|
||||
|
||||
headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
'User-Agent': 'API Explorer',
|
||||
'Travis-API-Version': '3',
|
||||
'Authorization': f'token {AUTH_TOKEN}'
|
||||
}
|
||||
|
||||
def last_docker_build():
|
||||
response = requests.get(f"{DOCKER}/branch/master", headers=headers)
|
||||
|
||||
if not response.ok:
|
||||
logging.error("Error while getting last_docker_build")
|
||||
sys.exit(1)
|
||||
|
||||
href = response.json()["last_build"]["@href"]
|
||||
build_info = requests.get(f"{ENDPOINT}{href}", headers=headers)
|
||||
|
||||
if not build_info.ok:
|
||||
logging.error("Error while getting build_info")
|
||||
sys.exit(1)
|
||||
|
||||
return build_info.json()
|
||||
|
||||
|
||||
|
||||
def trigger_build():
|
||||
response = requests.get(f"{DOCKER}/branch/master", headers=headers)
|
||||
build_info = last_docker_build()
|
||||
|
||||
pprint.pprint(build_info)
|
||||
|
||||
# Get last build info
|
||||
last_build_id = build_info["id"]
|
||||
last_build_status = build_info["state"]
|
||||
|
||||
# Create env variables
|
||||
env_vars = [
|
||||
{
|
||||
"env_var.name": "TRIGGER_COMMIT",
|
||||
"env_var.value": os.getenv("TRAVIS_COMMIT"),
|
||||
"env_var.public": False,
|
||||
},
|
||||
{
|
||||
"env_var.name": "TRIGGER_REPO",
|
||||
"env_var.value": os.getenv("TRAVIS_REPO_SLUG"),
|
||||
"env_var.public": False,
|
||||
},
|
||||
{
|
||||
"env_var.name": "TRIGGER_ACTION",
|
||||
"env_var.value": "build-doc",
|
||||
"env_var.public": False,
|
||||
},
|
||||
{
|
||||
"env_var.name": "DEPENDENT_BUILD",
|
||||
"env_var.value": "true",
|
||||
"env_var.public": False,
|
||||
},
|
||||
]
|
||||
|
||||
env_vars_results = requests.get(DOCKER_ENV_VARS_ENDPOINT, headers=headers)
|
||||
if not env_vars_results.ok:
|
||||
logger.error("Error while getting Docker env variables")
|
||||
sys.exit(1)
|
||||
env_vars_remote = env_vars_results.json()["env_vars"]
|
||||
|
||||
# Set env variables
|
||||
for env_var in env_vars:
|
||||
remote_var = next(filter(lambda v : v["name"] == env_var["env_var.name"], env_vars_remote), None)
|
||||
if remote_var:
|
||||
r = requests.patch(f"{DOCKER}/env_var/{remote_var['id']}", data=json.dumps(env_var), headers=headers)
|
||||
if not r.ok:
|
||||
logger.error(f"Error while setting variable: '{remote_var['name']}'")
|
||||
sys.exit(1)
|
||||
else:
|
||||
result = requests.post(DOCKER_ENV_VARS_ENDPOINT, data=json.dumps(env_var), headers=headers)
|
||||
if not result.ok:
|
||||
logger.error(f"Error while setting variable: '{env_var['env_var.name']}'")
|
||||
sys.exit(1)
|
||||
|
||||
# (Re)Start build
|
||||
result = requests.post(f"{ENDPOINT}/build/{last_build_id}/restart", headers=headers)
|
||||
if not result.ok:
|
||||
logger.error("Error while restarting the build")
|
||||
sys.exit(1)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
is_pull_request = not (os.getenv("TRAVIS_PULL_REQUEST", "false") == "false")
|
||||
|
||||
if is_pull_request:
|
||||
logger.info("Skipping pull request build...")
|
||||
return 0
|
||||
|
||||
return trigger_build()
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -1,84 +1,63 @@
|
||||
name: 'Android'
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
tags-ignore:
|
||||
- '**'
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
build-sdk:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
arch: ['arm', 'arm64']
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
echo "::set-output name=date::$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")"
|
||||
shell: bash
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v1.1.0
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: android-${{ runner.os }}-${{ matrix.arch }}-${{ steps.get-date.outputs.date }}
|
||||
key: android-${{ runner.os }}-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
android-${{ runner.os }}-${{ matrix.arch }}
|
||||
- name: Build SDK [${{ matrix.arch }}]
|
||||
android-${{ runner.os }}-
|
||||
- name: Build ARM SDK
|
||||
shell: bash
|
||||
env:
|
||||
ARCH: ${{ matrix.arch }}
|
||||
run: |
|
||||
docker run \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_CPP2=1 \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
docker run \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_CPP2=1 \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
-v $GITHUB_WORKSPACE:/work \
|
||||
-v $HOME/.ccache:/ccache \
|
||||
--rm liefproject/android-${ARCH} bash /work/scripts/docker/android-sdk-${ARCH}
|
||||
- name: 'Upload Artifact'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: android-sdk-${{ matrix.arch }}
|
||||
path: build/*.tar.gz
|
||||
retention-days: 3
|
||||
deploy:
|
||||
if: ${{ always() }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: build-sdk
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
path: ${{ runner.temp }}/artifacts
|
||||
- name: Display artifacts
|
||||
run: ls -R
|
||||
working-directory: ${{ runner.temp }}/artifacts
|
||||
-v $HOME/.ccache:/ccache \
|
||||
--rm liefproject/android-arm bash /work/scripts/docker/android-arm.sh
|
||||
- name: Build AArch64 SDK
|
||||
shell: bash
|
||||
run: |
|
||||
docker run \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_CPP2=1 \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
-v $GITHUB_WORKSPACE:/work \
|
||||
-v $HOME/.ccache:/ccache \
|
||||
--rm liefproject/android-arm64 bash /work/scripts/docker/android-aarch64.sh
|
||||
- name: Deploy
|
||||
env:
|
||||
LIEF_S3_KEY: ${{ secrets.LIEF_S3_KEY }}
|
||||
LIEF_S3_SECRET: ${{ secrets.LIEF_S3_SECRET }}
|
||||
LIEF_AUTOMATIC_BUILDS_KEY: ${{ secrets.LIEF_AUTOMATIC_BUILDS_KEY }}
|
||||
LIEF_AUTOMATIC_BUILDS_IV: ${{ secrets.LIEF_AUTOMATIC_BUILDS_IV }}
|
||||
shell: bash
|
||||
run: |
|
||||
docker run --rm \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-v $RUNNER_TEMP:/runner_tmp \
|
||||
-e GITHUB_ACTIONS="true" \
|
||||
-e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
|
||||
-e GITHUB_REF=$GITHUB_REF \
|
||||
docker run \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-e GITHUB_ACTIONS="true" \
|
||||
-e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
|
||||
-e GITHUB_REF=$GITHUB_REF \
|
||||
-e GITHUB_REPOSITORY=$GITHUB_REPOSITORY \
|
||||
-e LIEF_S3_KEY=$LIEF_S3_KEY \
|
||||
-e LIEF_S3_SECRET=$LIEF_S3_SECRET \
|
||||
liefproject/deploy python3 /src/.github/deploy.py /runner_tmp/artifacts
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY=$LIEF_AUTOMATIC_BUILDS_KEY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV=$LIEF_AUTOMATIC_BUILDS_IV \
|
||||
--rm \
|
||||
liefproject/deploy python3 /src/.github/deploy.py
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
name: 'iOS'
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
osx-sdk:
|
||||
runs-on: macos-11.0
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Python 3.9
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
brew install cmake ninja ccache
|
||||
python -m pip install --upgrade pip setuptools wheel
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "::set-output name=date::$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")"
|
||||
shell: bash
|
||||
- name: Setup cache dir
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p ~/.ccache
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v1.1.0
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: ios-${{ runner.os }}-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
ios-${{ runner.os }}-
|
||||
- name: Build iOS SDK
|
||||
shell: bash
|
||||
env:
|
||||
CCACHE_DIR: ~/.ccache
|
||||
CCACHE_MAXSIZE: 10.0G
|
||||
CCACHE_CPP2: 1
|
||||
CCACHE_COMPRESS: 1
|
||||
run: |
|
||||
bash scripts/osx/package_ios.sh
|
||||
- name: Deploy
|
||||
env:
|
||||
LIEF_AUTOMATIC_BUILDS_KEY: ${{ secrets.LIEF_AUTOMATIC_BUILDS_KEY }}
|
||||
LIEF_AUTOMATIC_BUILDS_IV: ${{ secrets.LIEF_AUTOMATIC_BUILDS_IV }}
|
||||
shell: bash
|
||||
run: |
|
||||
python -m pip install --upgrade requests mako
|
||||
python .github/deploy.py
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
name: 'Linux AArch64'
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
linux-sdk:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.7, 3.8, 3.9]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "::set-output name=date::$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")"
|
||||
shell: bash
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v1.1.0
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: linux-aarch64-${{ runner.os }}-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
linux-aarch64-${{ runner.os }}-
|
||||
- name: Build SDK
|
||||
if: matrix.python-version == '3.9'
|
||||
shell: bash
|
||||
run: |
|
||||
docker run \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_CPP2=1 \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
-v $GITHUB_WORKSPACE:/work \
|
||||
-v $HOME/.ccache:/ccache \
|
||||
--rm liefproject/manylinux2014-aarch64 bash /work/scripts/docker/linux-aarch64.sh
|
||||
- name: Build Python ${{ matrix.python-version }} wheel
|
||||
shell: bash
|
||||
env:
|
||||
PYTHON_VERSION: ${{ matrix.python-version }}
|
||||
run: |
|
||||
PYTHON_VERSION2=$(echo "${PYTHON_VERSION}" | sed 's/\.//') # Transform 3.8 -> 38
|
||||
docker run \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_CPP2=1 \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
-e PYTHON_BINARY=/opt/python/cp${PYTHON_VERSION2}-cp${PYTHON_VERSION2}/bin/python${PYTHON_VERSION} \
|
||||
-v $GITHUB_WORKSPACE:/work \
|
||||
-v $HOME/.ccache:/ccache \
|
||||
--rm liefproject/manylinux2014-aarch64 bash /work/scripts/docker/manylinux2014-aarch64.sh
|
||||
- name: Deploy
|
||||
env:
|
||||
LIEF_AUTOMATIC_BUILDS_KEY: ${{ secrets.LIEF_AUTOMATIC_BUILDS_KEY }}
|
||||
LIEF_AUTOMATIC_BUILDS_IV: ${{ secrets.LIEF_AUTOMATIC_BUILDS_IV }}
|
||||
shell: bash
|
||||
run: |
|
||||
docker run \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-e GITHUB_ACTIONS="true" \
|
||||
-e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
|
||||
-e GITHUB_REF=$GITHUB_REF \
|
||||
-e GITHUB_REPOSITORY=$GITHUB_REPOSITORY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY=$LIEF_AUTOMATIC_BUILDS_KEY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV=$LIEF_AUTOMATIC_BUILDS_IV \
|
||||
--rm \
|
||||
liefproject/deploy python3 /src/.github/deploy.py
|
||||
|
||||
|
||||
|
||||
@@ -1,277 +1,108 @@
|
||||
name: 'Linux x86-64'
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
tags-ignore:
|
||||
- '**'
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
linux-sdk:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: liefproject/manylinux_2_28_x86_64
|
||||
env:
|
||||
CCACHE_DIR: "/home/pylief/.ccache"
|
||||
CXXFLAGS: "-ffunction-sections -fdata-sections -fvisibility-inlines-hidden -static-libstdc++ -static-libgcc"
|
||||
CFLAGS: "-ffunction-sections -fdata-sections -static-libstdc++ -static-libgcc"
|
||||
LDFLAGS: "-Wl,--gc-sections -Wl,--exclude-libs,ALL"
|
||||
BUILD_DIR_STATIC: "/tmp/build/linux-x86-64/static-release"
|
||||
BUILD_DIR_SHARED: "/tmp/build/linux-x86-64/shared-release"
|
||||
CLICOLOR_FORCE: "1"
|
||||
ACTIONS_RUNTIME_URL: "${{ env.ACTIONS_RUNTIME_URL }}"
|
||||
ACTIONS_RUNTIME_TOKEN: "${{ env.ACTIONS_RUNTIME_TOKEN }}"
|
||||
ACTIONS_CACHE_URL: "${{ env.ACTIONS_CACHE_URL }}"
|
||||
options: --user 1001:1001
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
- name: Prepare ccache
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p /home/pylief/.ccache/tmp
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: /home/pylief/.ccache
|
||||
key: linux-x86-64-${{ runner.os }}-sdk-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
linux-x86-64-${{ runner.os }}-sdk
|
||||
- name: CMake - Static
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p ${BUILD_DIR_STATIC}
|
||||
cmake -S $GITHUB_WORKSPACE -B ${BUILD_DIR_STATIC} -GNinja \
|
||||
-DCMAKE_INSTALL_LIBDIR="lib" \
|
||||
-DCMAKE_LINK_WHAT_YOU_USE=on \
|
||||
-DBUILD_SHARED_LIBS=off \
|
||||
-DLIEF_INSTALL_COMPILED_EXAMPLES=on \
|
||||
-DCMAKE_INSTALL_PREFIX=/install \
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
- name: Compile - Static
|
||||
shell: bash
|
||||
run: |
|
||||
cmake --build ${BUILD_DIR_STATIC} --target install
|
||||
- name: CMake - Shared
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p ${BUILD_DIR_SHARED}
|
||||
cmake -S $GITHUB_WORKSPACE -B ${BUILD_DIR_SHARED} -GNinja \
|
||||
-DCMAKE_INSTALL_LIBDIR="lib" \
|
||||
-DCMAKE_LINK_WHAT_YOU_USE=on \
|
||||
-DBUILD_SHARED_LIBS=on \
|
||||
-DLIEF_INSTALL_COMPILED_EXAMPLES=off \
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
- name: Compile - Shared
|
||||
run: |
|
||||
cmake --build ${BUILD_DIR_SHARED} --target all
|
||||
- name: Package
|
||||
run: |
|
||||
cd /tmp/build/linux-x86-64
|
||||
cpack --config $GITHUB_WORKSPACE/cmake/cpack.config.cmake
|
||||
- name: 'Upload SDK Artifact'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: linux-x86-64-sdk
|
||||
path: /tmp/build/linux-x86-64/*.tar.gz
|
||||
retention-days: 3
|
||||
- name: 'Upload Install Artifact'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: linux-x86-64-install
|
||||
path: /install
|
||||
retention-days: 1
|
||||
testing:
|
||||
if: "!contains(github.event.commits[0].message, '[skip-test]')"
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: liefproject/manylinux_2_28_x86_64
|
||||
env:
|
||||
PYTHON_BINARY: "/opt/python/cp312-cp312/bin/python3.12"
|
||||
LIEF_SAMPLES_DIR: "/tmp/samples"
|
||||
LIEF_BUILD_DIR: "/tmp/lief-build"
|
||||
LIEF_VENV: "/tmp/venv"
|
||||
CLICOLOR_FORCE: "1"
|
||||
PYTEST_ADDOPTS: "--color=yes"
|
||||
options: --user 1001:1001
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
echo "::set-output name=date::$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")"
|
||||
shell: bash
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v1.1.0
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: linux-x86-64-${{ runner.os }}-test-${{ steps.get-date.outputs.date }}
|
||||
key: linux-x86-64-${{ runner.os }}-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
linux-x86-64-${{ runner.os }}-test
|
||||
- name: Prepare Python virtual env
|
||||
linux-x86-64-${{ runner.os }}-
|
||||
- name: Build Python 3.7 wheel
|
||||
shell: bash
|
||||
run: |
|
||||
$PYTHON_BINARY -m venv ${LIEF_VENV}
|
||||
source ${LIEF_VENV}/bin/activate
|
||||
python -m pip install \
|
||||
-r tests/requirements.txt \
|
||||
-r api/python/build-requirements.txt
|
||||
- name: Build & install LIEF
|
||||
shell: bash
|
||||
run: |
|
||||
source ${LIEF_VENV}/bin/activate
|
||||
export PYLIEF_CONF="${GITHUB_WORKSPACE}/scripts/docker/config/pylinux-test-x64.toml"
|
||||
python -m pip -vvv install api/python
|
||||
- name: Prepare test samples
|
||||
shell: bash
|
||||
run: |
|
||||
source ${LIEF_VENV}/bin/activate
|
||||
mkdir -p ${LIEF_SAMPLES_DIR}
|
||||
python tests/dl_samples.py ${LIEF_SAMPLES_DIR}
|
||||
- name: Run tests
|
||||
timeout-minutes: 5
|
||||
shell: bash
|
||||
run: |
|
||||
source ${LIEF_VENV}/bin/activate
|
||||
python tests/run_pytest.py
|
||||
python tests/run_tools_check.py ${LIEF_BUILD_DIR}/
|
||||
ctest --output-on-failure --test-dir ${LIEF_BUILD_DIR}/
|
||||
- name: Fuzzing [ls x86-64]
|
||||
shell: bash
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
source ${LIEF_VENV}/bin/activate
|
||||
export PYTHONPATH="${GITHUB_WORKSPACE}/tests:$PYTHONPATH"
|
||||
python tests/elf/fuzzing.py \
|
||||
${LIEF_BUILD_DIR}/tests/Melkor/src/MELKOR/melkor \
|
||||
--input-seed ${LIEF_SAMPLES_DIR}/ELF/ELF64_x86-64_binary_ls.bin -n 100
|
||||
- name: Fuzzing [openssl x86-64]
|
||||
shell: bash
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
source ${LIEF_VENV}/bin/activate
|
||||
export PYTHONPATH="${GITHUB_WORKSPACE}/tests:$PYTHONPATH"
|
||||
python tests/elf/fuzzing.py \
|
||||
${LIEF_BUILD_DIR}/tests/Melkor/src/MELKOR/melkor \
|
||||
--input-seed ${LIEF_SAMPLES_DIR}/ELF/ELF64_x86-64_binary_openssl.bin -n 100
|
||||
- name: Fuzzing [nm x86-64]
|
||||
shell: bash
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
source ${LIEF_VENV}/bin/activate
|
||||
export PYTHONPATH="${GITHUB_WORKSPACE}/tests:$PYTHONPATH"
|
||||
python tests/elf/fuzzing.py \
|
||||
${LIEF_BUILD_DIR}/tests/Melkor/src/MELKOR/melkor \
|
||||
--input-seed ${LIEF_SAMPLES_DIR}/ELF/ELF64_x86-64_binary_nm.bin -n 100
|
||||
|
||||
pywheels:
|
||||
runs-on: ubuntu-latest
|
||||
needs: linux-sdk
|
||||
container:
|
||||
image: liefproject/manylinux_2_28_x86_64
|
||||
env:
|
||||
CCACHE_DIR: "/home/pylief/.ccache"
|
||||
CXXFLAGS: "-ffunction-sections -fdata-sections -fvisibility-inlines-hidden -static-libgcc"
|
||||
CFLAGS: "-ffunction-sections -fdata-sections -static-libgcc"
|
||||
LDFLAGS: "-Wl,--gc-sections -Wl,--exclude-libs,ALL"
|
||||
CLICOLOR_FORCE: "1"
|
||||
FORCE_COLOR: "1"
|
||||
LIEF_BUILD_DIR: "/tmp/lief-build"
|
||||
ACTIONS_RUNTIME_URL: "${{ env.ACTIONS_RUNTIME_URL }}"
|
||||
ACTIONS_RUNTIME_TOKEN: "${{ env.ACTIONS_RUNTIME_TOKEN }}"
|
||||
ACTIONS_CACHE_URL: "${{ env.ACTIONS_CACHE_URL }}"
|
||||
options: --user 1001:1001
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ['3.12', '3.13', '3.14']
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
- name: Prepare ccache
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p /home/pylief/.ccache/tmp
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: /home/pylief/.ccache
|
||||
key: linux-x86-64-${{ runner.os }}-${{ matrix.python-version }}-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
linux-x86-64-${{ runner.os }}-${{ matrix.python-version }}
|
||||
- name: Download LIEF install dir
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: linux-x86-64-install
|
||||
path: /install
|
||||
- name: Generate wheel
|
||||
env:
|
||||
PYTHON_VERSION: ${{ matrix.python-version }}
|
||||
PYTHON_VERSION: 37
|
||||
run: |
|
||||
docker run --rm \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_CPP2=1 \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
-e PYTHON_VERSION=$PYTHON_VERSION \
|
||||
-e PYTHON_BINARY=/opt/python/cp37-cp37m/bin/python3.7 \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-v $HOME/.ccache:/ccache \
|
||||
liefproject/manylinux1_x86_64 bash /src/scripts/docker/travis-linux.sh
|
||||
- name: Build Python 3.8 wheel
|
||||
shell: bash
|
||||
env:
|
||||
PYTHON_VERSION: 38
|
||||
run: |
|
||||
docker run --rm \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_CPP2=1 \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
-e PYTHON_VERSION=$PYTHON_VERSION \
|
||||
-e PYTHON_BINARY=/opt/python/cp38-cp38/bin/python3.8 \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-v $HOME/.ccache:/ccache \
|
||||
liefproject/manylinux1_x86_64 bash /src/scripts/docker/travis-linux.sh
|
||||
- name: Build Python 3.9 wheel
|
||||
shell: bash
|
||||
env:
|
||||
PYTHON_VERSION: 39
|
||||
run: |
|
||||
docker run --rm \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_CPP2=1 \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
-e PYTHON_VERSION=$PYTHON_VERSION \
|
||||
-e PYTHON_BINARY=/opt/python/cp39-cp39/bin/python3.9 \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-v $HOME/.ccache:/ccache \
|
||||
liefproject/manylinux1_x86_64 bash /src/scripts/docker/travis-linux.sh
|
||||
- name: Build SDK
|
||||
shell: bash
|
||||
run: |
|
||||
export PYLIEF_CONF=$GITHUB_WORKSPACE/scripts/docker/config/pylinux-x64.toml
|
||||
PYTHON_VERSION_ALT=$(echo "${PYTHON_VERSION}" | sed 's/\.//') # Transform 3.8 -> 38
|
||||
PYTHON_BINARY=/opt/python/cp${PYTHON_VERSION_ALT}-cp${PYTHON_VERSION_ALT}/bin/python${PYTHON_VERSION}
|
||||
$PYTHON_BINARY -m pip -vvv wheel --disable-pip-version-check \
|
||||
--wheel-dir=$GITHUB_WORKSPACE/wheel_stage \
|
||||
$GITHUB_WORKSPACE/api/python
|
||||
- name: Run auditwheel
|
||||
shell: bash
|
||||
run: |
|
||||
ls -alh $GITHUB_WORKSPACE/wheel_stage
|
||||
find $GITHUB_WORKSPACE/wheel_stage -exec \
|
||||
auditwheel repair -w $GITHUB_WORKSPACE/dist {} \;
|
||||
ls -alh $GITHUB_WORKSPACE/dist
|
||||
- name: 'Artifact'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: linux-x86-64-python${{ matrix.python-version }}-wheel
|
||||
path: dist/*.whl
|
||||
retention-days: 3
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ always() }}
|
||||
needs: [pywheels]
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: linux-x86-64-*
|
||||
merge-multiple: true
|
||||
path: ${{ runner.temp }}/artifacts
|
||||
- name: Display artifacts
|
||||
run: ls -R
|
||||
working-directory: ${{ runner.temp }}/artifacts
|
||||
docker run --name lief_sdk --rm \
|
||||
-e PYTHON_BINARY=/opt/python/cp39-cp39/bin/python3.9 \
|
||||
-e CCACHE_COMPRESS=1 \
|
||||
-e CCACHE_MAXSIZE=10.0G \
|
||||
-e CCACHE_DIR=/ccache \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-v $HOME/.ccache:/ccache \
|
||||
liefproject/manylinux1_x86_64 bash /src/scripts/docker/travis-linux-sdk.sh
|
||||
- name: Deploy
|
||||
env:
|
||||
LIEF_S3_KEY: ${{ secrets.LIEF_S3_KEY }}
|
||||
LIEF_S3_SECRET: ${{ secrets.LIEF_S3_SECRET }}
|
||||
LIEF_AUTOMATIC_BUILDS_KEY: ${{ secrets.LIEF_AUTOMATIC_BUILDS_KEY }}
|
||||
LIEF_AUTOMATIC_BUILDS_IV: ${{ secrets.LIEF_AUTOMATIC_BUILDS_IV }}
|
||||
shell: bash
|
||||
run: |
|
||||
docker run --rm \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-v $RUNNER_TEMP:/runner_tmp \
|
||||
-e GITHUB_ACTIONS="true" \
|
||||
-e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
|
||||
-e GITHUB_REF=$GITHUB_REF \
|
||||
-e GITHUB_REPOSITORY=$GITHUB_REPOSITORY \
|
||||
-e LIEF_S3_KEY=$LIEF_S3_KEY \
|
||||
-e LIEF_S3_SECRET=$LIEF_S3_SECRET \
|
||||
liefproject/deploy \
|
||||
python3 /src/.github/deploy.py --skip-sdk /runner_tmp/artifacts
|
||||
docker run \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-e GITHUB_ACTIONS="true" \
|
||||
-e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
|
||||
-e GITHUB_REF=$GITHUB_REF \
|
||||
-e GITHUB_REPOSITORY=$GITHUB_REPOSITORY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY=$LIEF_AUTOMATIC_BUILDS_KEY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV=$LIEF_AUTOMATIC_BUILDS_IV \
|
||||
--rm \
|
||||
liefproject/deploy python3 /src/.github/deploy.py
|
||||
- name: Trigger documentation
|
||||
env:
|
||||
CIRCLE_CI_TOKEN: ${{ secrets.CIRCLE_CI_TOKEN }}
|
||||
shell: bash
|
||||
run: |
|
||||
docker run --rm \
|
||||
-e CIRCLE_CI_TOKEN=$CIRCLE_CI_TOKEN \
|
||||
liefproject/manylinux1_x86_64 \
|
||||
bash -c "curl --request POST --url https://circleci.com/api/v2/project/gh/lief-project/doc/pipeline --header 'Circle-Token: ${CIRCLE_CI_TOKEN}' --header 'content-type: application/json'";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+35
-189
@@ -1,224 +1,70 @@
|
||||
name: 'macOS'
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
tags-ignore:
|
||||
- '**'
|
||||
|
||||
env:
|
||||
python-test-version: '3.13'
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
osx-sdk:
|
||||
runs-on: macos-14
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
brew install cmake ninja ccache
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
- name: Setup cache dir
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p $RUNNER_TEMP/.ccache
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ runner.temp }}/.ccache
|
||||
key: osx-${{ runner.os }}-sdk-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
osx-${{ runner.os }}-sdk
|
||||
- name: Build SDK
|
||||
shell: bash
|
||||
env:
|
||||
CLICOLOR_FORCE: "1"
|
||||
MACOSX_DEPLOYMENT_TARGET: "11.0"
|
||||
CCACHE_DIR: ${{ runner.temp }}/.ccache
|
||||
CCACHE_MAXSIZE: 10.0G
|
||||
CCACHE_CPP2: 1
|
||||
CCACHE_COMPRESS: 1
|
||||
run: |
|
||||
bash scripts/osx/package_sdk.sh
|
||||
- name: 'Upload SDK Artifact'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: osx-sdk
|
||||
path: build/*.tar.gz
|
||||
retention-days: 3
|
||||
- name: 'Upload install artifact [arm64]'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: osx-arm64-install
|
||||
path: install/arm64
|
||||
retention-days: 1
|
||||
- name: 'Upload install artifact [x64]'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: osx-x64-install
|
||||
path: install/x64
|
||||
retention-days: 1
|
||||
osx-testing:
|
||||
runs-on: macos-14
|
||||
if: "!contains(github.event.commits[0].message, '[skip-test]')"
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Python ${{ env.python-test-version }}
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ env.python-test-version }}
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
brew install cmake ninja ccache
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
- name: Setup cache dir
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p $RUNNER_TEMP/.ccache
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ${{ runner.temp }}/.ccache
|
||||
key: osx-${{ runner.os }}-test-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
osx-${{ runner.os }}-test
|
||||
- name: Upgrade pip
|
||||
shell: bash
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
- name: Build Python 3.13 with tests
|
||||
shell: bash
|
||||
env:
|
||||
LIEF_SAMPLES_DIR: "/tmp/samples"
|
||||
LIEF_BUILD_DIR: "/tmp/lief-build"
|
||||
PYLIEF_CONF: "${{ github.workspace }}/scripts/osx/osx-testing-x64.toml"
|
||||
CLICOLOR_FORCE: "1"
|
||||
PYTEST_ADDOPTS: "--color=yes"
|
||||
FORCE_COLOR: "1"
|
||||
MACOSX_TARGET: "11.7"
|
||||
MACOSX_DEPLOYMENT_TARGET: "11.0"
|
||||
CCACHE_DIR: ${{ runner.temp }}/.ccache
|
||||
CCACHE_MAXSIZE: 10.0G
|
||||
CCACHE_CPP2: 1
|
||||
CCACHE_COMPRESS: 1
|
||||
run: |
|
||||
python -m pip install -r tests/requirements.txt
|
||||
python -m pip -vvv install api/python
|
||||
python tests/dl_samples.py ${LIEF_SAMPLES_DIR}
|
||||
- name: Run tests
|
||||
shell: bash
|
||||
timeout-minutes: 20
|
||||
env:
|
||||
LIEF_SAMPLES_DIR: "/tmp/samples"
|
||||
LIEF_BUILD_DIR: "/tmp/lief-build"
|
||||
PYTEST_ADDOPTS: "--color=yes"
|
||||
run: |
|
||||
python tests/run_pytest.py
|
||||
python tests/run_tools_check.py ${LIEF_BUILD_DIR}/
|
||||
ctest --output-on-failure --test-dir ${LIEF_BUILD_DIR}/
|
||||
wheels:
|
||||
runs-on: macos-14
|
||||
needs: osx-sdk
|
||||
runs-on: macos-11.0
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ['3.12', '3.13', '3.14']
|
||||
arch: ['x64', 'arm64']
|
||||
fail-fast: false
|
||||
python-version: [3.6, 3.7, 3.8, 3.9]
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
brew install cmake ninja ccache
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install --upgrade pip setuptools wheel
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
echo "::set-output name=date::$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")"
|
||||
shell: bash
|
||||
- name: Setup cache dir
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p $RUNNER_TEMP/.ccache
|
||||
mkdir -p ~/.ccache
|
||||
- name: ccache cache files
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@v1.1.0
|
||||
with:
|
||||
path: ${{ runner.temp }}/.ccache
|
||||
key: osx-${{ runner.os }}-${{ matrix.arch }}-${{ matrix.python-version }}-${{ steps.get-date.outputs.date }}
|
||||
path: ~/.ccache
|
||||
key: osx-${{ runner.os }}-${{ matrix.python-version }}-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
osx-${{ runner.os }}-${{ matrix.arch }}-${{ matrix.python-version }}
|
||||
- name: Download LIEF install dir
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: osx-${{ matrix.arch }}-install
|
||||
path: ~/lief-${{ matrix.arch }}-install
|
||||
- name: Build Python ${{ matrix.python-version }} [${{ matrix.arch }}]
|
||||
osx-${{ runner.os }}-${{ matrix.python-version }}-
|
||||
osx-${{ runner.os }}-
|
||||
- name: Build Python ${{ matrix.python-version }} wheel
|
||||
shell: bash
|
||||
env:
|
||||
MACOSX_DEPLOYMENT_TARGET: "11.0"
|
||||
FORCE_COLOR: "1"
|
||||
CLICOLOR_FORCE: "1"
|
||||
CCACHE_DIR: ${{ runner.temp }}/.ccache
|
||||
MACOSX_DEPLOYMENT_TARGET: "10.14"
|
||||
CCACHE_DIR: ~/.ccache
|
||||
CCACHE_MAXSIZE: 10.0G
|
||||
CCACHE_CPP2: 1
|
||||
CCACHE_COMPRESS: 1
|
||||
PYLIEF_CONF: "${{ github.workspace }}/scripts/osx/py-${{ matrix.arch }}.toml"
|
||||
run: |
|
||||
python -m pip -vv wheel --wheel-dir=dist/ api/python
|
||||
- name: 'Upload Python wheel artifact - ${{ matrix.python-version }}'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: osx-wheel-${{ matrix.arch }}-${{ matrix.python-version }}
|
||||
path: dist/*.whl
|
||||
retention-days: 3
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ always() }}
|
||||
needs: [wheels]
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: osx-*
|
||||
merge-multiple: true
|
||||
path: ${{ runner.temp }}/artifacts
|
||||
- name: Display artifacts
|
||||
run: ls -R
|
||||
working-directory: ${{ runner.temp }}/artifacts
|
||||
python ./setup.py --ninja build bdist_wheel --skip-build --plat-name=macosx_${MACOSX_DEPLOYMENT_TARGET}_x86_64
|
||||
- name: Build SDK
|
||||
shell: bash
|
||||
if: matrix.python-version == '3.9' # Build the SDk only with Python 3.9
|
||||
env:
|
||||
MACOSX_DEPLOYMENT_TARGET: "10.14"
|
||||
CCACHE_DIR: ~/.ccache
|
||||
CCACHE_MAXSIZE: 10.0G
|
||||
CCACHE_CPP2: 1
|
||||
CCACHE_COMPRESS: 1
|
||||
run: |
|
||||
bash scripts/osx/package_sdk.sh
|
||||
- name: Deploy
|
||||
env:
|
||||
LIEF_S3_KEY: ${{ secrets.LIEF_S3_KEY }}
|
||||
LIEF_S3_SECRET: ${{ secrets.LIEF_S3_SECRET }}
|
||||
LIEF_AUTOMATIC_BUILDS_KEY: ${{ secrets.LIEF_AUTOMATIC_BUILDS_KEY }}
|
||||
LIEF_AUTOMATIC_BUILDS_IV: ${{ secrets.LIEF_AUTOMATIC_BUILDS_IV }}
|
||||
shell: bash
|
||||
run: |
|
||||
docker run --rm \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-v $RUNNER_TEMP:/runner_tmp \
|
||||
-e GITHUB_ACTIONS="true" \
|
||||
-e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
|
||||
-e GITHUB_REF=$GITHUB_REF \
|
||||
-e GITHUB_REPOSITORY=$GITHUB_REPOSITORY \
|
||||
-e LIEF_S3_KEY=$LIEF_S3_KEY \
|
||||
-e LIEF_S3_SECRET=$LIEF_S3_SECRET \
|
||||
liefproject/deploy \
|
||||
python3 /src/.github/deploy.py --skip-sdk /runner_tmp/artifacts
|
||||
python -m pip install --upgrade requests mako
|
||||
python .github/deploy.py
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
name: LIEF PR
|
||||
on: [pull_request, workflow_dispatch]
|
||||
|
||||
env:
|
||||
python-osx-version: '3.12'
|
||||
python-win-version: '3.12'
|
||||
|
||||
jobs:
|
||||
osx:
|
||||
runs-on: macos-14
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ env.python-osx-version }}
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
brew install cmake ninja ccache
|
||||
python -m pip install --upgrade pip
|
||||
- name: Build with Python ${{ env.python-osx-version }} & Test
|
||||
shell: bash
|
||||
env:
|
||||
LIEF_SAMPLES_DIR: "/tmp/samples"
|
||||
LIEF_BUILD_DIR: "/tmp/lief-build"
|
||||
PYLIEF_CONF: "${{ github.workspace }}/scripts/osx/osx-testing-x64.toml"
|
||||
run: |
|
||||
python -m pip install -r tests/requirements.txt
|
||||
python -m pip install -e api/python
|
||||
python tests/dl_samples.py ${LIEF_SAMPLES_DIR}
|
||||
python tests/run_pytest.py
|
||||
python tests/run_tools_check.py ${LIEF_BUILD_DIR}
|
||||
ctest --output-on-failure --test-dir ${LIEF_BUILD_DIR}
|
||||
linux:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Build & Test
|
||||
shell: bash
|
||||
env:
|
||||
PYTHON_VERSION: 312
|
||||
run: |
|
||||
docker run --rm \
|
||||
-e PYTHON_VERSION=$PYTHON_VERSION \
|
||||
-e PYTHON_BINARY=/opt/python/cp312-cp312/bin/python3.12 \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
liefproject/manylinux_2_28_x86_64 \
|
||||
bash /src/scripts/docker/test-linux-x64
|
||||
windows:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- name: Set up Python ${{ env.python-win-version }}
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ env.python-win-version }}
|
||||
architecture: x64
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
choco install ninja
|
||||
python -m pip install --upgrade pip
|
||||
- uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
vsversion: "2022"
|
||||
- name: Set env variables
|
||||
run: |
|
||||
chcp 65001 #set code page to utf-8
|
||||
echo ("LIEF_SAMPLES_DIR=" + $env:RUNNER_TEMP + "/samples") >> $env:GITHUB_ENV
|
||||
echo ("LIEF_BUILD_DIR=" + $env:RUNNER_TEMP + "/lief-build") >> $env:GITHUB_ENV
|
||||
echo ("PYLIEF_CONF=" + $env:GITHUB_WORKSPACE + "/scripts/windows/py-x64-test.toml") >> $env:GITHUB_ENV
|
||||
- name: Build Python ${{ env.python-win-version }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
python -m pip install -r tests/requirements.txt
|
||||
python -m pip install api/python
|
||||
python tests/dl_samples.py $env:LIEF_SAMPLES_DIR
|
||||
- name: Run tests - unittests
|
||||
shell: pwsh
|
||||
run: |
|
||||
cd $env:GITHUB_WORKSPACE
|
||||
ctest --output-on-failure --test-dir $env:LIEF_BUILD_DIR
|
||||
Exit $LASTEXITCODE
|
||||
- name: Run tests - python
|
||||
shell: pwsh
|
||||
run: |
|
||||
cd $env:GITHUB_WORKSPACE
|
||||
python tests/run_pytest.py
|
||||
Exit $LASTEXITCODE
|
||||
@@ -1,268 +0,0 @@
|
||||
name: LIEF Windows
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
tags-ignore:
|
||||
- '**'
|
||||
|
||||
env:
|
||||
python-test-version: '3.13'
|
||||
python-version: '3.13'
|
||||
CLICOLOR_FORCE: "1"
|
||||
FORCE_COLOR: "1"
|
||||
GCC_COLORS: "yes"
|
||||
COLORTERM: "truecolor"
|
||||
TERM: "screen-256color"
|
||||
CLICOLOR: "1"
|
||||
|
||||
jobs:
|
||||
build-sdk:
|
||||
runs-on: windows-2022
|
||||
strategy:
|
||||
matrix:
|
||||
arch: ['x64', 'x86']
|
||||
fail-fast: false
|
||||
env:
|
||||
SCCACHE_CACHE_SIZE: 2G
|
||||
SCCACHE_DIR: ${{ vars.SCCACHE_DIR }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ env.python-version }}
|
||||
architecture: ${{ matrix.arch }}
|
||||
- run: python -m pip install setuptools
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
choco install ninja
|
||||
choco install sccache
|
||||
- uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
vsversion: "2022"
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
- name: Setup sccache
|
||||
uses: actions/cache@v5
|
||||
continue-on-error: false
|
||||
with:
|
||||
path: ${{ vars.SCCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ matrix.arch }}-sccache-sdk-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ matrix.arch }}-sccache-sdk
|
||||
- name: Start sccache server
|
||||
run: sccache --start-server
|
||||
- name: Build SDK
|
||||
run: |
|
||||
python ./scripts/windows/package_sdk.py
|
||||
- name: 'Upload SDK artifact'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: windows-${{ matrix.arch }}-sdk
|
||||
path: build/*.zip
|
||||
retention-days: 3
|
||||
- name: 'Upload install artifact'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: windows-${{ matrix.arch }}-install
|
||||
path: ${{ runner.temp }}/lief-install
|
||||
retention-days: 1
|
||||
- name: sccache stats
|
||||
run: sccache --show-stats
|
||||
- name: stop sccache server
|
||||
run: sccache --stop-server || true
|
||||
tests:
|
||||
runs-on: windows-2022
|
||||
if: "!contains(github.event.commits[0].message, '[skip-test]')"
|
||||
strategy:
|
||||
matrix:
|
||||
arch: ['x64']
|
||||
fail-fast: false
|
||||
env:
|
||||
SCCACHE_CACHE_SIZE: 2G
|
||||
SCCACHE_DIR: ${{ vars.SCCACHE_DIR }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Python ${{ env.python-test-version }}
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ env.python-test-version }}
|
||||
architecture: ${{ matrix.arch }}
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
choco install ninja
|
||||
choco install sccache
|
||||
- uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
vsversion: "2022"
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
- name: Setup sccache
|
||||
uses: actions/cache@v5
|
||||
continue-on-error: false
|
||||
with:
|
||||
path: ${{ vars.SCCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ matrix.arch }}-sccache-test-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ matrix.arch }}-sccache-test
|
||||
- name: Start sccache server
|
||||
run: sccache --start-server
|
||||
- name: Set arch specific env
|
||||
if: matrix.arch == 'x64'
|
||||
run: |
|
||||
echo "ARCH=x64" >> $env:GITHUB_ENV
|
||||
- name: Set arch specific env
|
||||
if: matrix.arch == 'x86'
|
||||
run: |
|
||||
echo "ARCH=x86" >> $env:GITHUB_ENV
|
||||
- name: Set Python config (${{ matrix.arch }})
|
||||
run: |
|
||||
echo ("PYLIEF_CONF=" + $env:GITHUB_WORKSPACE + "/scripts/windows/py-" + $env:ARCH + "-test.toml") >> $env:GITHUB_ENV
|
||||
- name: Set env variables
|
||||
run: |
|
||||
chcp 65001 #set code page to utf-8
|
||||
echo ("LIEF_SAMPLES_DIR=" + $env:RUNNER_TEMP + "/samples") >> $env:GITHUB_ENV
|
||||
echo ("LIEF_BUILD_DIR=" + $env:RUNNER_TEMP + "/lief-build") >> $env:GITHUB_ENV
|
||||
- name: Build Python ${{ env.python-test-version }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
python -m pip install -r tests/requirements.txt
|
||||
python tests/dl_samples.py $env:LIEF_SAMPLES_DIR
|
||||
python -m pip -vvv install --user api/python
|
||||
Exit $LASTEXITCODE
|
||||
- name: Download samples
|
||||
shell: pwsh
|
||||
run: |
|
||||
python -m pip install -r tests/requirements.txt
|
||||
python tests/dl_samples.py $env:LIEF_SAMPLES_DIR
|
||||
- name: Run unittests
|
||||
shell: pwsh
|
||||
run: |
|
||||
cd $env:GITHUB_WORKSPACE
|
||||
ctest --output-on-failure --test-dir $env:LIEF_BUILD_DIR
|
||||
Exit $LASTEXITCODE
|
||||
- name: Run Python tests
|
||||
timeout-minutes: 20
|
||||
shell: pwsh
|
||||
run: |
|
||||
cd $env:GITHUB_WORKSPACE
|
||||
python tests/run_pytest.py
|
||||
Exit $LASTEXITCODE
|
||||
- name: sccache stats
|
||||
run: sccache --show-stats
|
||||
- name: stop sccache server
|
||||
run: sccache --stop-server || true
|
||||
wheels:
|
||||
runs-on: windows-2022
|
||||
needs: build-sdk
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ['3.12', '3.13', '3.14']
|
||||
arch: ['x86', 'x64']
|
||||
fail-fast: false
|
||||
env:
|
||||
SCCACHE_CACHE_SIZE: 2G
|
||||
SCCACHE_DIR: ${{ vars.SCCACHE_DIR }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
architecture: ${{ matrix.arch }}
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
choco install ninja
|
||||
choco install sccache
|
||||
python -m pip install --upgrade pip
|
||||
- uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
vsversion: "2022"
|
||||
- name: Get Date
|
||||
id: get-date
|
||||
run: |
|
||||
echo "date=$(/bin/date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
- name: Save sccache
|
||||
uses: actions/cache@v5
|
||||
continue-on-error: false
|
||||
with:
|
||||
path: ${{ vars.SCCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ matrix.arch }}-sccache-${{ matrix.python-version }}-${{ steps.get-date.outputs.date }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ matrix.arch }}-sccache-${{ matrix.python-version }}
|
||||
- name: Download LIEF install dir
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: windows-${{ matrix.arch }}-install
|
||||
path: ~/lief-${{ matrix.arch }}-install
|
||||
- name: Start sccache server
|
||||
run: sccache --start-server
|
||||
- name: Set arch specific env
|
||||
if: matrix.arch == 'x64'
|
||||
run: |
|
||||
echo "ARCH=x64" >> $env:GITHUB_ENV
|
||||
- name: Set arch specific env
|
||||
if: matrix.arch == 'x86'
|
||||
run: |
|
||||
echo "ARCH=x86" >> $env:GITHUB_ENV
|
||||
- name: Set Python config (${{ matrix.arch }})
|
||||
run: |
|
||||
echo ("PYLIEF_CONF=" + $env:GITHUB_WORKSPACE + "/scripts/windows/py-" + $env:ARCH + ".toml") >> $env:GITHUB_ENV
|
||||
- name: Set env variables
|
||||
run: |
|
||||
chcp 65001 #set code page to utf-8
|
||||
- name: Build Python ${{ matrix.python-version }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
python -m pip -vvv wheel --wheel-dir=dist/ ./api/python
|
||||
- name: 'Upload Python artifacts [${{ matrix.python-version }}]'
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: windows-${{ matrix.arch }}-wheel-${{ matrix.python-version }}
|
||||
path: dist/*.whl
|
||||
retention-days: 3
|
||||
deploy:
|
||||
if: ${{ always() }}
|
||||
runs-on: ubuntu-latest
|
||||
#needs: [build-sdk, wheels]
|
||||
needs: [wheels]
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: windows-*
|
||||
merge-multiple: true
|
||||
path: ${{ runner.temp }}/artifacts
|
||||
- name: Deploy
|
||||
env:
|
||||
LIEF_S3_KEY: ${{ secrets.LIEF_S3_KEY }}
|
||||
LIEF_S3_SECRET: ${{ secrets.LIEF_S3_SECRET }}
|
||||
shell: bash
|
||||
run: |
|
||||
docker run --rm \
|
||||
-v $GITHUB_WORKSPACE:/src \
|
||||
-v $RUNNER_TEMP:/runner_tmp \
|
||||
-e GITHUB_ACTIONS="true" \
|
||||
-e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \
|
||||
-e GITHUB_REF=$GITHUB_REF \
|
||||
-e GITHUB_REPOSITORY=$GITHUB_REPOSITORY \
|
||||
-e LIEF_S3_KEY=$LIEF_S3_KEY \
|
||||
-e LIEF_S3_SECRET=$LIEF_S3_SECRET \
|
||||
liefproject/deploy python3 /src/.github/deploy.py --skip-sdk /runner_tmp/artifacts
|
||||
@@ -0,0 +1,30 @@
|
||||
name: LIEF Windows Tests
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.8]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
choco install ninja
|
||||
python -m pip install --upgrade pip setuptools
|
||||
python -m pip install wheel mako
|
||||
- uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
toolset: "14.16"
|
||||
- name: Build and Test
|
||||
run: |
|
||||
python ./setup.py --ninja --lief-test bdist_wheel
|
||||
shell: cmd
|
||||
|
||||
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
build/
|
||||
*.so
|
||||
*.whl
|
||||
*.dll
|
||||
*.dylib
|
||||
*.lib
|
||||
lief.egg-info/
|
||||
dist/
|
||||
**/target/*
|
||||
api/rust/cargo/target/*
|
||||
api/rust/examples/target/*
|
||||
tools/target/*
|
||||
plugins/ghidra/bin/
|
||||
api/python/tests/lib/
|
||||
dev-scripts/
|
||||
@@ -1,4 +0,0 @@
|
||||
include:
|
||||
- project: 'LIEF/ci'
|
||||
ref: main
|
||||
file: 'main.yml'
|
||||
+322
@@ -0,0 +1,322 @@
|
||||
language: cpp
|
||||
|
||||
git:
|
||||
depth: false
|
||||
|
||||
jobs:
|
||||
include:
|
||||
- if: branch = master AND tag IS present
|
||||
services: docker
|
||||
name: "Linux Python 3.5"
|
||||
script:
|
||||
- >
|
||||
docker run --name lief_35
|
||||
-e PYTHON_BINARY=/opt/python/cp35-cp35m/bin/python3.5
|
||||
-e CCACHE_DIR=/ccache
|
||||
-v $HOME/.ccache:/ccache
|
||||
-v $TRAVIS_BUILD_DIR:/src
|
||||
liefproject/manylinux1_x86_64
|
||||
bash /src/scripts/docker/travis-linux.sh
|
||||
- >
|
||||
if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
docker run \
|
||||
-v $TRAVIS_BUILD_DIR:/src \
|
||||
-e TRAVIS="true" \
|
||||
-e TRAVIS_EVENT_TYPE=$TRAVIS_EVENT_TYPE \
|
||||
-e TRAVIS_REPO_SLUG=$TRAVIS_REPO_SLUG \
|
||||
-e TRAVIS_BRANCH=$TRAVIS_BRANCH \
|
||||
-e TRAVIS_BUILD_DIR=$TRAVIS_BUILD_DIR \
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY=$LIEF_AUTOMATIC_BUILDS_KEY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV=$LIEF_AUTOMATIC_BUILDS_IV \
|
||||
--rm \
|
||||
liefproject/deploy python3 /src/.github/deploy.py;
|
||||
fi
|
||||
|
||||
|
||||
- if: branch = master AND tag IS present
|
||||
services: docker
|
||||
name: "Linux Python 3.6"
|
||||
script:
|
||||
- >
|
||||
docker run --name lief_36
|
||||
-e PYTHON_BINARY=/opt/python/cp36-cp36m/bin/python3.6
|
||||
-e CCACHE_DIR=/ccache
|
||||
-v $HOME/.ccache:/ccache
|
||||
-v $TRAVIS_BUILD_DIR:/src
|
||||
liefproject/manylinux1_x86_64
|
||||
bash /src/scripts/docker/travis-linux.sh
|
||||
- >
|
||||
if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
docker run \
|
||||
-v $TRAVIS_BUILD_DIR:/src \
|
||||
-e TRAVIS="true" \
|
||||
-e TRAVIS_EVENT_TYPE=$TRAVIS_EVENT_TYPE \
|
||||
-e TRAVIS_REPO_SLUG=$TRAVIS_REPO_SLUG \
|
||||
-e TRAVIS_BRANCH=$TRAVIS_BRANCH \
|
||||
-e TRAVIS_BUILD_DIR=$TRAVIS_BUILD_DIR \
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY=$LIEF_AUTOMATIC_BUILDS_KEY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV=$LIEF_AUTOMATIC_BUILDS_IV \
|
||||
--rm \
|
||||
liefproject/deploy python3 /src/.github/deploy.py;
|
||||
fi
|
||||
|
||||
- services: docker
|
||||
name: "Linux Python 3.7 | SDK | Doc Trigger"
|
||||
script:
|
||||
- >
|
||||
docker run --name lief_37
|
||||
-e PYTHON_BINARY=/opt/python/cp37-cp37m/bin/python3.7
|
||||
-e CCACHE_DIR=/ccache
|
||||
-v $HOME/.ccache:/ccache
|
||||
-v $TRAVIS_BUILD_DIR:/src
|
||||
liefproject/manylinux1_x86_64
|
||||
bash /src/scripts/docker/travis-linux.sh
|
||||
- >
|
||||
docker run --name lief_sdk
|
||||
-e PYTHON_BINARY=$PYTHON_BINARY
|
||||
-e CCACHE_DIR=/ccache
|
||||
-v $HOME/.ccache:/ccache
|
||||
-v $TRAVIS_BUILD_DIR:/src
|
||||
liefproject/manylinux1_x86_64
|
||||
bash /src/scripts/docker/travis-linux-sdk.sh
|
||||
- >
|
||||
sudo chmod -R 777 $TRAVIS_BUILD_DIR/build &&
|
||||
sudo chown -R 1000:1000 $TRAVIS_BUILD_DIR/build
|
||||
- >
|
||||
if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
docker run \
|
||||
-v $TRAVIS_BUILD_DIR:/src \
|
||||
-e TRAVIS="true" \
|
||||
-e TRAVIS_EVENT_TYPE=$TRAVIS_EVENT_TYPE \
|
||||
-e TRAVIS_REPO_SLUG=$TRAVIS_REPO_SLUG \
|
||||
-e TRAVIS_BRANCH=$TRAVIS_BRANCH \
|
||||
-e TRAVIS_BUILD_DIR=$TRAVIS_BUILD_DIR \
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY=$LIEF_AUTOMATIC_BUILDS_KEY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV=$LIEF_AUTOMATIC_BUILDS_IV \
|
||||
--rm \
|
||||
liefproject/deploy python3 /src/.github/deploy.py;
|
||||
fi
|
||||
after_success:
|
||||
- >
|
||||
if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]];
|
||||
then
|
||||
docker run --rm
|
||||
-e CIRCLE_CI_TOKEN=$CIRCLE_CI_TOKEN
|
||||
liefproject/manylinux1_x86_64
|
||||
bash -c "curl --request POST --url https://circleci.com/api/v2/project/gh/lief-project/doc/pipeline --header 'Circle-Token: ${CIRCLE_CI_TOKEN}' --header 'content-type: application/json'";
|
||||
fi
|
||||
|
||||
- services: docker
|
||||
name: "Linux Python 3.8"
|
||||
script:
|
||||
- >
|
||||
docker run --name lief_38
|
||||
-e PYTHON_BINARY=/opt/python/cp38-cp38/bin/python3.8
|
||||
-e CCACHE_DIR=/ccache
|
||||
-v $HOME/.ccache:/ccache
|
||||
-v $TRAVIS_BUILD_DIR:/src
|
||||
liefproject/manylinux1_x86_64
|
||||
bash /src/scripts/docker/travis-linux.sh
|
||||
- >
|
||||
sudo chmod -R 777 $TRAVIS_BUILD_DIR/build &&
|
||||
sudo chown -R 1000:1000 $TRAVIS_BUILD_DIR/build
|
||||
- >
|
||||
if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
docker run \
|
||||
-v $TRAVIS_BUILD_DIR:/src \
|
||||
-e TRAVIS="true" \
|
||||
-e TRAVIS_EVENT_TYPE=$TRAVIS_EVENT_TYPE \
|
||||
-e TRAVIS_REPO_SLUG=$TRAVIS_REPO_SLUG \
|
||||
-e TRAVIS_BRANCH=$TRAVIS_BRANCH \
|
||||
-e TRAVIS_BUILD_DIR=$TRAVIS_BUILD_DIR \
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY=$LIEF_AUTOMATIC_BUILDS_KEY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV=$LIEF_AUTOMATIC_BUILDS_IV \
|
||||
--rm \
|
||||
liefproject/deploy python3 /src/.github/deploy.py;
|
||||
fi
|
||||
- services: docker
|
||||
name: "Linux Python 3.9"
|
||||
script:
|
||||
- >
|
||||
docker run --name lief_39
|
||||
-e PYTHON_BINARY=/opt/python/cp39-cp39/bin/python3.9
|
||||
-e CCACHE_DIR=/ccache
|
||||
-v $HOME/.ccache:/ccache
|
||||
-v $TRAVIS_BUILD_DIR:/src
|
||||
liefproject/manylinux1_x86_64
|
||||
bash /src/scripts/docker/travis-linux.sh
|
||||
- >
|
||||
sudo chmod -R 777 $TRAVIS_BUILD_DIR/build &&
|
||||
sudo chown -R 1000:1000 $TRAVIS_BUILD_DIR/build
|
||||
- >
|
||||
if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
docker run \
|
||||
-v $TRAVIS_BUILD_DIR:/src \
|
||||
-e TRAVIS="true" \
|
||||
-e TRAVIS_EVENT_TYPE=$TRAVIS_EVENT_TYPE \
|
||||
-e TRAVIS_REPO_SLUG=$TRAVIS_REPO_SLUG \
|
||||
-e TRAVIS_BRANCH=$TRAVIS_BRANCH \
|
||||
-e TRAVIS_BUILD_DIR=$TRAVIS_BUILD_DIR \
|
||||
-e LIEF_AUTOMATIC_BUILDS_KEY=$LIEF_AUTOMATIC_BUILDS_KEY \
|
||||
-e LIEF_AUTOMATIC_BUILDS_IV=$LIEF_AUTOMATIC_BUILDS_IV \
|
||||
--rm \
|
||||
liefproject/deploy python3 /src/.github/deploy.py;
|
||||
fi
|
||||
|
||||
## macOS 10.14.6 - xcode 11 - Python 3.5
|
||||
#- if: branch = master AND tag IS present AND type = push
|
||||
# os: osx
|
||||
# osx_image: xcode11
|
||||
# compiler: clang
|
||||
# script:
|
||||
# - pyenv install --skip-existing 3.5.0
|
||||
# - >
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.5.0/bin/python3.5 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools wheel &&
|
||||
# $PYTHON_BINARY ./setup.py --ninja --lief-test build bdist_wheel
|
||||
# after_success:
|
||||
# - >
|
||||
# if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.5.0/bin/python3.5 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools requests mako wheel &&
|
||||
# cd $TRAVIS_BUILD_DIR &&
|
||||
# bash ./.github/deploy.sh;
|
||||
# fi
|
||||
|
||||
## macOS 10.14.6 - xcode 11 - Python 3.6
|
||||
#- if: branch = master AND tag IS present AND type = push
|
||||
# os: osx
|
||||
# osx_image: xcode11
|
||||
# compiler: clang
|
||||
# script:
|
||||
# - pyenv install --skip-existing 3.6.0
|
||||
# - >
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.6.0/bin/python3.6 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools wheel &&
|
||||
# $PYTHON_BINARY ./setup.py --ninja --lief-test build bdist_wheel
|
||||
# after_success:
|
||||
# - >
|
||||
# if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.6.0/bin/python3.6 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools requests mako wheel &&
|
||||
# cd $TRAVIS_BUILD_DIR &&
|
||||
# bash ./.github/deploy.sh;
|
||||
# fi
|
||||
|
||||
|
||||
## macOS 10.14.6 - xcode 11 - Python 3.7
|
||||
#- os: osx
|
||||
# osx_image: xcode11
|
||||
# compiler: clang
|
||||
# script:
|
||||
# - pyenv install --skip-existing 3.7.0
|
||||
# - >
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.7.0/bin/python3.7 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools wheel &&
|
||||
# $PYTHON_BINARY ./setup.py --ninja --lief-test build bdist_wheel
|
||||
# after_success:
|
||||
# - >
|
||||
# if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.7.0/bin/python3.7 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools requests mako wheel &&
|
||||
# cd $TRAVIS_BUILD_DIR &&
|
||||
# bash ./.github/deploy.sh;
|
||||
# fi
|
||||
|
||||
# macOS 10.14.6 - xcode 11 - Python 3.8
|
||||
#- os: osx
|
||||
# osx_image: xcode11
|
||||
# compiler: clang
|
||||
# name: "OSX Python 3.8"
|
||||
# script:
|
||||
# - pyenv install --skip-existing 3.8.0
|
||||
# - >
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.8.0/bin/python3.8 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools wheel &&
|
||||
# $PYTHON_BINARY ./setup.py --ninja --lief-test build bdist_wheel
|
||||
# after_success:
|
||||
# - >
|
||||
# if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.8.0/bin/python3.8 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools requests mako wheel &&
|
||||
# cd $TRAVIS_BUILD_DIR &&
|
||||
# bash ./.github/deploy.sh;
|
||||
# fi
|
||||
|
||||
## macOS 10.14.6 - xcode 11 - Python 3.9
|
||||
#- os: osx
|
||||
# osx_image: xcode11
|
||||
# compiler: clang
|
||||
# name: "OSX Python 3.9 | SDK"
|
||||
# script:
|
||||
# - pyenv install --skip-existing 3.9.0
|
||||
# - >
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.9.0/bin/python3.9 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools wheel &&
|
||||
# $PYTHON_BINARY ./setup.py --ninja --lief-test build bdist_wheel
|
||||
# - bash scripts/osx/package_sdk.sh
|
||||
# after_success:
|
||||
# - >
|
||||
# if [[ "$TRAVIS_EVENT_TYPE" != "pull_request" ]]; then
|
||||
# export PYTHON_BINARY=$(pyenv root)/versions/3.9.0/bin/python3.9 &&
|
||||
# sudo $PYTHON_BINARY -m pip install --upgrade pip setuptools requests mako wheel &&
|
||||
# cd $TRAVIS_BUILD_DIR &&
|
||||
# bash ./.github/deploy.sh;
|
||||
# fi
|
||||
|
||||
|
||||
#branches:
|
||||
# only:
|
||||
# - master
|
||||
|
||||
notifications:
|
||||
email:
|
||||
on_success: never
|
||||
on_failure: always
|
||||
|
||||
cache:
|
||||
- ccache: true
|
||||
- directories:
|
||||
- $HOME/.pyenv
|
||||
- $HOME/.ccache
|
||||
|
||||
env:
|
||||
global:
|
||||
- USE_CCACHE=1
|
||||
- CCACHE_COMPRESS=1
|
||||
- CCACHE_MAXSIZE=10.0G
|
||||
- CCACHE_CPP2=1
|
||||
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
- pyenv
|
||||
- ccache
|
||||
- ninja
|
||||
update: true
|
||||
|
||||
before_install:
|
||||
- ccache --set-config=max_size=10.0G
|
||||
- ccache --zero-stats --version
|
||||
- ccache --set-config=compiler_check=content
|
||||
- ccache -p
|
||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then docker pull liefproject/manylinux1_x86_64:latest; fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PREFIX="/usr/local"; fi
|
||||
#- if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PATH="/usr/local/opt/ccache/libexec:$PATH"; fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PYTHON_CONFIGURE_OPTS="--enable-shared --enable-unicode=ucs2"; fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then pyenv root; fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then pyenv install --list ;fi
|
||||
|
||||
after_script:
|
||||
- ccache --show-stats
|
||||
|
||||
#deploy:
|
||||
# provider: releases
|
||||
# token:
|
||||
# - secure: LTJMZp9kJ9/tmv73YGktP3Bdhh3moettDNooiRlQfUEgUemRlp9K+ybbufN0ya0Md0bouOJ/7nWqFToWl1G5/kcRr4MjV/P2c+iH8W7mvWcFupLGdwm1+aqpin3hiGsdYz0a1TK37y6DANspFwHILjq1SPf5L8kGEHnYSIfyUFHaETbv7GHL+4gf1XG/55KVuyFa3vZ2BPa3sIXr4bRypdNsqssFOZ7qeoJawtcI3TbjmLqx+sOGR2aiG+9lX+/vcYVGECHOE4KdV5BbTFitDLkJ0toAQrgN4XuB6XMXEnijU0RGtpkvsUAYJUuYaNcV2ea4bwLPCKz0IJvzTw3gtyB/pioP4OUx0xY2csuNuGfppZ0Fb+BWhPx9wOg209lrPjtoWszK8vo4PywKlEUviNG+3hEYx9x382IbtbXvIxp+c2iYdRicudFIdjjSZt7fy1MwBvHhWoBRl1hVw5fpFvRIC6Q1/B6MV55Jc3LVYCs+QHPAXq2KJ1KWK/Q7mmlriG3O+dvswcE1l0/AmeqKuXLsgUMuzScYa4fMFvXL3l/B8bKw205ynMzKvbb61P3sGrJJ+AFDEoHDk8yNtSaTowoUveu75DbL1s1p02QjYeVt7AJS8AsqUm7QPcUU5iXW1gSgt50jD/46/uvK7NZCFj2LzkiVzM5JIbiUANx8pKA=
|
||||
# file_glob: true
|
||||
# file:
|
||||
# - ${TRAVIS_BUILD_DIR}/dist/*.whl
|
||||
# - ${TRAVIS_BUILD_DIR}/build/*.tar.gz
|
||||
# on:
|
||||
# tags: true
|
||||
@@ -1,3 +1,3 @@
|
||||
Authors:
|
||||
|
||||
Romain Thomas <me@romainthomas.fr>
|
||||
Romain Thomas <rthomas@quarkslab.com>
|
||||
|
||||
+6
-3
@@ -4,10 +4,13 @@ Acknowledgements
|
||||
LIEF makes use of the following open source projects:
|
||||
|
||||
- mbedTLS - https://tls.mbed.org/
|
||||
- nanobind - https://github.com/wjakob/nanobind
|
||||
- pybind11 - https://github.com/pybind/pybind11
|
||||
- json - https://nlohmann.github.io/json/
|
||||
- spdlog - https://github.com/gabime/spdlog
|
||||
- Catch2 - https://github.com/catchorg/Catch2
|
||||
- rang - https://agauniyal.github.io/rang/
|
||||
- easyloggingpp - https://github.com/muflihun/easyloggingpp
|
||||
- Catch - https://github.com/philsquared/Catch
|
||||
- yamlcpp - https://github.com/jbeder/yaml-cpp
|
||||
- filesystem - https://github.com/wjakob/filesystem
|
||||
- utf8-cpp - https://sourceforge.net/projects/utfcpp/
|
||||
- llvm - http://llvm.org/ - For the formats enums and structures
|
||||
- virtualbox - https://www.virtualbox.org/ - For the PE 'LoadConfiguration' structures
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
see doc/sphinx/changelog.md
|
||||
|
||||
see doc/sphinx/changelog.rst
|
||||
|
||||
|
||||
+391
-327
@@ -1,45 +1,35 @@
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
project(LIEF LANGUAGES C CXX)
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
# Modules
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
|
||||
|
||||
if(WIN32)
|
||||
include(ChooseMSVCCRT)
|
||||
endif()
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckCCompilerFlag)
|
||||
include(ExternalProject)
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
find_package(Git)
|
||||
if (DEFINED ENV{LIEF_VERSION_ENV})
|
||||
string(REGEX MATCHALL "([0-9]+)" VERSION_STRING "$ENV{LIEF_VERSION_ENV}")
|
||||
if (NOT VERSION_STRING)
|
||||
message(FATAL_ERROR "Invalid version")
|
||||
endif()
|
||||
list(GET VERSION_STRING 0 LIEF_VERSION_MAJOR)
|
||||
list(GET VERSION_STRING 1 LIEF_VERSION_MINOR)
|
||||
list(GET VERSION_STRING 2 LIEF_VERSION_PATCH)
|
||||
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git"
|
||||
AND IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git" AND Git_FOUND)
|
||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git"
|
||||
AND IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||
find_package(Git REQUIRED)
|
||||
|
||||
# Information from git
|
||||
# ====================
|
||||
include(LIEFGit)
|
||||
else()
|
||||
set(LIEF_VERSION_MAJOR 2)
|
||||
set(LIEF_VERSION_MINOR 0)
|
||||
set(LIEF_VERSION_PATCH 0)
|
||||
endif()
|
||||
|
||||
if (DEFINED ENV{LIEF_COMMIT})
|
||||
set(LIEF_COMMIT_HASH "$ENV{LIEF_COMMIT}")
|
||||
endif()
|
||||
|
||||
if (DEFINED ENV{LIEF_BRANCH})
|
||||
set(LIEF_GIT_BRANCH "$ENV{LIEF_BRANCH}")
|
||||
set(LIEF_VERSION_MAJOR "0")
|
||||
set(LIEF_VERSION_MINOR "12")
|
||||
set(LIEF_VERSION_PATCH "0")
|
||||
endif()
|
||||
|
||||
# LIEF Project
|
||||
# ============
|
||||
project(LIEF VERSION
|
||||
${LIEF_VERSION_MAJOR}.${LIEF_VERSION_MINOR}.${LIEF_VERSION_PATCH})
|
||||
project(
|
||||
LIEF
|
||||
VERSION ${LIEF_VERSION_MAJOR}.${LIEF_VERSION_MINOR}.${LIEF_VERSION_PATCH})
|
||||
message(STATUS "${PROJECT_NAME} ${PROJECT_VERSION}")
|
||||
|
||||
# LIEF options
|
||||
@@ -55,12 +45,12 @@ message(STATUS "Caching: ${LIEF_USE_CCACHE}")
|
||||
if(LIEF_USE_CCACHE)
|
||||
find_program(CCACHE_FOUND ccache)
|
||||
if(CCACHE_FOUND)
|
||||
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_FOUND})
|
||||
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_FOUND})
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
||||
message(STATUS "Found ccache: ${CCACHE_FOUND}")
|
||||
else()
|
||||
find_program(SCCACHE_FOUND sccache)
|
||||
if(SCCACHE_FOUND)
|
||||
if (SCCACHE_FOUND)
|
||||
set(CMAKE_C_COMPILER_LAUNCHER ${SCCACHE_FOUND})
|
||||
set(CMAKE_CXX_COMPILER_LAUNCHER ${SCCACHE_FOUND})
|
||||
message(STATUS "Found sccache: ${SCCACHE_FOUND}")
|
||||
@@ -84,12 +74,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "")
|
||||
endif()
|
||||
|
||||
set(LIEF_EXTRA_FLAGS)
|
||||
|
||||
message(STATUS "LIEF_EXTRA_FLAGS: ${LIEF_EXTRA_FLAGS}")
|
||||
message(STATUS "CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}")
|
||||
message(STATUS "CMAKE_CXX_FLAGS_RELWITHDEBINFO: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
||||
message(STATUS "CMAKE_CXX_FLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}")
|
||||
message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
|
||||
message(STATUS "CMAKE_CXX_LINK_EXECUTABLE: ${CMAKE_CXX_LINK_EXECUTABLE}")
|
||||
message(STATUS "CMAKE_CXX_LINK_FLAGS: ${CMAKE_CXX_LINK_FLAGS}")
|
||||
@@ -102,77 +87,102 @@ message(STATUS "CMAKE_LINK_LIBRARY_FILE_FLAG: ${CMAKE_LINK_LIBRARY_FILE_FLA
|
||||
message(STATUS "CMAKE_LINK_INTERFACE_LIBRARIES: ${CMAKE_LINK_INTERFACE_LIBRARIES}")
|
||||
message(STATUS "CMAKE_CXX_IMPLICIT_LINK_LIBRARIES: ${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES}")
|
||||
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
|
||||
message(STATUS "CMAKE_MSVC_RUNTIME_LIBRARY: ${CMAKE_MSVC_RUNTIME_LIBRARY}")
|
||||
|
||||
include(GNUInstallDirs)
|
||||
|
||||
# LIEF Source definition
|
||||
# ======================
|
||||
add_library(LIB_LIEF src/Object.cpp)
|
||||
add_subdirectory(src)
|
||||
set_source_files_properties(${mbedtls_src_crypto} PROPERTIES GENERATED TRUE)
|
||||
set_source_files_properties(${mbedtls_src_x509} PROPERTIES GENERATED TRUE)
|
||||
set_source_files_properties(${mbedtls_src_tls} PROPERTIES GENERATED TRUE)
|
||||
|
||||
if (LIEF_EXTRA_FLAGS)
|
||||
target_compile_options(LIB_LIEF PRIVATE ${LIEF_EXTRA_FLAGS})
|
||||
set(LIEF_PRIVATE_INCLUDE_DIR)
|
||||
set(LIEF_PUBLIC_INCLUDE_DIR)
|
||||
|
||||
set(LIEF_PUBLIC_INCLUDE_FILES)
|
||||
set(LIEF_PRIVATE_INCLUDE_FILES)
|
||||
|
||||
set(LIBLIEF_SOURCE_FILES
|
||||
"${mbedtls_src_crypto}"
|
||||
"${mbedtls_src_x509}"
|
||||
"${mbedtls_src_tls}"
|
||||
"${LIBFUZZER_SRC_FILES}"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/errors.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/hash_stream.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/logging.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/exception.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/iostream.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/utils.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/Object.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/Object.tcc"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/Visitor.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/BinaryStream/BinaryStream.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/BinaryStream/VectorStream.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/BinaryStream/MemoryStream.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/BinaryStream/Convert.cpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/visitors/hash.cpp")
|
||||
|
||||
# Grouping basic headers together
|
||||
# ===============================
|
||||
set(LIEF_INC_FILES
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/errors.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/Abstract.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/exception.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/iostream.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/iterators.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/LIEF.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/logging.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/MachO.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/types.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/utils.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/visibility.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/Object.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/Visitor.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/visitor_macros.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/BinaryStream/BinaryStream.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/BinaryStream/VectorStream.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/BinaryStream/MemoryStream.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/BinaryStream/Convert.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/hash_stream.hpp"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src/frozen.hpp")
|
||||
|
||||
set(LIEF_VISITOR_INCLUDE_FILES
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/hash.hpp")
|
||||
|
||||
set(LIEF_INCLUDE_FILES ${LIEF_INC_FILES} ${LIEF_VISITOR_INCLUDE_FILES})
|
||||
|
||||
set(LIEF_JSON_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/visitors/json.cpp")
|
||||
set(LIEF_JSON_HDR "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/json.hpp"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/json.hpp")
|
||||
|
||||
if(LIEF_ENABLE_JSON)
|
||||
list(APPEND LIBLIEF_SOURCE_FILES "${LIEF_JSON_SRC}")
|
||||
list(APPEND LIEF_INC_FILES "${LIEF_JSON_HDR}")
|
||||
endif()
|
||||
|
||||
if(LIEF_PRECOMPILED)
|
||||
find_package(lief-extended QUIET)
|
||||
if (NOT lief-extended_FOUND)
|
||||
find_package(LIEF REQUIRED)
|
||||
endif()
|
||||
else()
|
||||
add_library(LIEF::LIEF ALIAS LIB_LIEF)
|
||||
endif()
|
||||
source_group("Header Files" FILES ${LIEF_INC_FILES})
|
||||
source_group("Source Files" FILES ${LIBLIEF_SOURCE_FILES})
|
||||
|
||||
source_group("Header Files\\visitors" FILES ${LIEF_VISITOR_INCLUDE_FILES})
|
||||
|
||||
if(NOT LIEF_OPT_MBEDTLS_EXTERNAL)
|
||||
target_sources(LIB_LIEF PRIVATE ${mbedtls_src_files})
|
||||
add_library(LIB_LIEF ${LIBLIEF_SOURCE_FILES} ${LIEF_INCLUDE_FILES})
|
||||
|
||||
target_include_directories(LIB_LIEF SYSTEM PRIVATE
|
||||
${MBEDTLS_INCLUDE_DIRS}
|
||||
"${MBEDTLS_SOURCE_DIR}/library"
|
||||
)
|
||||
if (LIEF_PYTHON_FREE_THREADED)
|
||||
target_compile_definitions(LIB_LIEF PRIVATE
|
||||
# these must be set at LIB_LIEF compile time to be forwarded to MbedTLS
|
||||
-DMBEDTLS_THREADING_C
|
||||
-DMBEDTLS_THREADING_ALT
|
||||
)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(LIB_LIEF PRIVATE
|
||||
-DTF_PSA_CRYPTO_USER_CONFIG_FILE="${CMAKE_CURRENT_SOURCE_DIR}/config/mbedtls/psa_config.h"
|
||||
)
|
||||
else()
|
||||
find_package(MbedTLS 4.0.0 EXACT REQUIRED)
|
||||
target_link_libraries(LIB_LIEF PRIVATE
|
||||
MbedTLS::tfpsacrypto MbedTLS::mbedx509)
|
||||
if (LIEF_PYTHON_FREE_THREADED)
|
||||
message(WARNING "Python free-threading requires the external MbedTLS to have \
|
||||
been built with threading support. LIEF cannot enforce this.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
target_compile_definitions(LIB_LIEF PRIVATE
|
||||
-DMBEDTLS_CONFIG_FILE="${CMAKE_CURRENT_SOURCE_DIR}/config/mbedtls/config.h"
|
||||
-DMBEDTLS_X509_USE_C
|
||||
-DMBEDTLS_PK_PARSE_C
|
||||
)
|
||||
|
||||
if (WIN32)
|
||||
target_link_libraries(LIB_LIEF PRIVATE bcrypt)
|
||||
endif()
|
||||
|
||||
if(WIN32 AND BUILD_SHARED_LIBS)
|
||||
target_link_libraries(LIB_LIEF PRIVATE ws2_32)
|
||||
if (LIEF_IMPORT_SUFFIX)
|
||||
set_target_properties(LIB_LIEF PROPERTIES IMPORT_SUFFIX "${LIEF_IMPORT_SUFFIX}")
|
||||
endif()
|
||||
if(WINDOWS AND BUILD_SHARED_LIBS)
|
||||
target_link_libraries(LIB_LIEF ws2_32)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
target_compile_options(LIB_LIEF PRIVATE /bigobj)
|
||||
target_compile_options(LIB_LIEF PUBLIC /Zc:__cplusplus)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /bigobj")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
|
||||
endif()
|
||||
|
||||
if(CMAKE_BUILD_TYPE MATCHES Debug AND WINDOWS)
|
||||
add_definitions(-D_ITERATOR_DEBUG_LEVEL=0 -D_SECURE_SCL=0
|
||||
-D_HAS_ITERATOR_DEBUGGING=0)
|
||||
endif()
|
||||
|
||||
if(CMAKE_BUILD_TYPE MATCHES Debug AND UNIX)
|
||||
target_compile_options(LIB_LIEF PRIVATE -g -O0)
|
||||
endif()
|
||||
|
||||
if(BUILD_SHARED_LIBS OR LIEF_FORCE_API_EXPORTS)
|
||||
@@ -180,31 +190,96 @@ if(BUILD_SHARED_LIBS OR LIEF_FORCE_API_EXPORTS)
|
||||
else()
|
||||
target_compile_definitions(LIB_LIEF PRIVATE -DLIEF_STATIC)
|
||||
endif()
|
||||
if(LIEF_SUPPORT_CXX14)
|
||||
target_compile_features(LIB_LIEF PRIVATE cxx_std_14)
|
||||
endif()
|
||||
|
||||
# Abstract part
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/src/Abstract/CMakeLists.txt")
|
||||
|
||||
if(LIEF_ENABLE_JSON)
|
||||
# Make nlohmann/json is only using C++11 API.
|
||||
# Especially, MSVC[14.37.32822] is buggy with (no)rtti & std::any
|
||||
# Ref:
|
||||
# - https://github.com/nlohmann/json/issues/3900
|
||||
# - https://github.com/microsoft/STL/issues/4349#issuecomment-1920093172
|
||||
target_compile_definitions(LIB_LIEF PRIVATE JSON_HAS_CPP_11)
|
||||
# ELF Part
|
||||
# ========
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/src/ELF/CMakeLists.txt")
|
||||
if(LIEF_ELF)
|
||||
set(ENABLE_ELF_SUPPORT 1)
|
||||
else()
|
||||
set(ENABLE_ELF_SUPPORT 0)
|
||||
endif()
|
||||
|
||||
# PE Part
|
||||
# =======
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/src/PE/CMakeLists.txt")
|
||||
if(LIEF_PE)
|
||||
set(ENABLE_PE_SUPPORT 1)
|
||||
else()
|
||||
set(ENABLE_PE_SUPPORT 0)
|
||||
endif()
|
||||
|
||||
# MachO part
|
||||
# ==========
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/src/MachO/CMakeLists.txt")
|
||||
if(LIEF_MACHO)
|
||||
set(ENABLE_MACHO_SUPPORT 1)
|
||||
else()
|
||||
set(ENABLE_MACHO_SUPPORT 0)
|
||||
endif()
|
||||
|
||||
# Logging Configuration
|
||||
# =====================
|
||||
|
||||
target_compile_definitions(LIB_LIEF PRIVATE SPDLOG_DISABLE_DEFAULT_LOGGER
|
||||
SPDLOG_NO_EXCEPTIONS
|
||||
SPDLOG_FUNCTION=)
|
||||
|
||||
if (MSVC AND NOT CLANG_CL AND NOT LIEF_EXTERNAL_SPDLOG)
|
||||
target_compile_definitions(LIB_LIEF PRIVATE FMT_UNICODE=0)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||
target_compile_definitions(LIB_LIEF PRIVATE SPDLOG_NO_EXCEPTIONS SPDLOG_NO_THREAD_ID)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||
target_compile_definitions(LIB_LIEF PRIVATE SPDLOG_NO_THREAD_ID)
|
||||
# Frozen Configuration
|
||||
# ====================
|
||||
if(LIEF_FROZEN_ENABLED)
|
||||
list(APPEND LIEF_PRIVATE_INCLUDE_DIR "${FROZEN_INCLUDE_DIR}")
|
||||
endif()
|
||||
|
||||
# OAT part
|
||||
# ========
|
||||
if(LIEF_OAT)
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/src/OAT/CMakeLists.txt)
|
||||
set(ENABLE_OAT_SUPPORT 1)
|
||||
else()
|
||||
set(ENABLE_OAT_SUPPORT 0)
|
||||
endif()
|
||||
|
||||
# DEX part
|
||||
# ========
|
||||
if(LIEF_DEX)
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/src/DEX/CMakeLists.txt)
|
||||
set(ENABLE_DEX_SUPPORT 1)
|
||||
else()
|
||||
set(ENABLE_DEX_SUPPORT 0)
|
||||
endif()
|
||||
|
||||
# VDEX part
|
||||
# =========
|
||||
if(LIEF_VDEX)
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/src/VDEX/CMakeLists.txt)
|
||||
set(ENABLE_VDEX_SUPPORT 1)
|
||||
else()
|
||||
set(ENABLE_VDEX_SUPPORT 0)
|
||||
endif()
|
||||
|
||||
# ART part
|
||||
# ========
|
||||
if(LIEF_ART)
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/src/ART/CMakeLists.txt)
|
||||
set(ENABLE_ART_SUPPORT 1)
|
||||
else()
|
||||
set(ENABLE_ART_SUPPORT 0)
|
||||
endif()
|
||||
|
||||
# Platforms
|
||||
# =========
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/src/platforms/CMakeLists.txt)
|
||||
|
||||
# LIEF includes
|
||||
# =============
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/version.h.in"
|
||||
@@ -213,158 +288,129 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/version.h.in"
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/config.h.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/config.h" @ONLY)
|
||||
|
||||
set(LIEF_PUBLIC_INCLUDE_DIR
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/
|
||||
${CMAKE_CURRENT_BINARY_DIR}/include/)
|
||||
list(APPEND LIEF_PUBLIC_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include/"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/")
|
||||
|
||||
set(LIEF_PRIVATE_INCLUDE_DIR
|
||||
${LIEF_PUBLIC_INCLUDE_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||
${CMAKE_CURRENT_BINARY_DIR})
|
||||
list(APPEND LIEF_PRIVATE_INCLUDE_DIR "${LIEF_PUBLIC_INCLUDE_DIR}"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/LIEF.pc.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/LIEF.pc @ONLY)
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/LIEF.pc.in ${CMAKE_CURRENT_BINARY_DIR}/LIEF.pc
|
||||
@ONLY)
|
||||
|
||||
target_include_directories(LIB_LIEF
|
||||
PUBLIC "$<BUILD_INTERFACE:${LIEF_PUBLIC_INCLUDE_DIR}>"
|
||||
# Grouping external projects
|
||||
# ==========================
|
||||
source_group("mbedtls\\crypto" FILES ${mbedtls_src_crypto})
|
||||
source_group("mbedtls\\x509" FILES ${mbedtls_src_x509})
|
||||
source_group("mbedtls\\tls" FILES ${mbedtls_src_tls})
|
||||
|
||||
# Library definition
|
||||
# ==================
|
||||
target_include_directories(
|
||||
LIB_LIEF SYSTEM PRIVATE "${MBEDTLS_INCLUDE_DIRS}")
|
||||
|
||||
target_include_directories(
|
||||
LIB_LIEF
|
||||
PUBLIC "${LIEF_PUBLIC_INCLUDE_DIR}"
|
||||
PRIVATE "${LIEF_PRIVATE_INCLUDE_DIR}")
|
||||
|
||||
target_precompile_headers(LIB_LIEF PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/lief-pch.hpp
|
||||
)
|
||||
|
||||
if(LIEF_ENABLE_JSON)
|
||||
if(LIEF_OPT_NLOHMANN_JSON_EXTERNAL)
|
||||
find_package(nlohmann_json REQUIRED)
|
||||
target_link_libraries(LIB_LIEF PRIVATE nlohmann_json::nlohmann_json)
|
||||
else()
|
||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/internal/nlohmann)
|
||||
file(COPY ${LIBJSON_SOURCE_DIR}/
|
||||
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/internal/nlohmann/)
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/json.hpp
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -E copy_directory ${LIBJSON_SOURCE_DIR}/
|
||||
${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/
|
||||
DEPENDS lief_libjson)
|
||||
|
||||
target_include_directories(LIB_LIEF PRIVATE
|
||||
${CMAKE_CURRENT_BINARY_DIR}/)
|
||||
endif()
|
||||
target_compile_definitions(LIB_LIEF PRIVATE JSON_NOEXCEPTION)
|
||||
target_sources(LIB_LIEF PRIVATE
|
||||
${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/json.hpp)
|
||||
endif()
|
||||
|
||||
if(LIEF_FROZEN_ENABLED)
|
||||
if(LIEF_OPT_FROZEN_EXTERNAL)
|
||||
find_package(frozen REQUIRED)
|
||||
target_link_libraries(LIB_LIEF PRIVATE frozen::frozen)
|
||||
else()
|
||||
target_include_directories(LIB_LIEF
|
||||
PRIVATE "${FROZEN_INCLUDE_DIR}")
|
||||
endif()
|
||||
add_dependencies(LIB_LIEF lief_frozen)
|
||||
endif()
|
||||
|
||||
|
||||
# =======================================
|
||||
# Expected
|
||||
# Leaf
|
||||
# =======================================
|
||||
if(LIEF_EXTERNAL_EXPECTED)
|
||||
message(STATUS "Using external Expected version")
|
||||
find_package(tl-expected REQUIRED)
|
||||
target_link_libraries(LIB_LIEF PUBLIC tl::expected)
|
||||
else()
|
||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/internal/)
|
||||
file(COPY ${EXPECTED_SRC_DIR}/include/tl/
|
||||
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/internal/)
|
||||
endif()
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/boost/leaf/all.hpp
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -E copy_directory ${LEAF_INCLUDE_DIR}/
|
||||
${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/
|
||||
DEPENDS lief_leaf)
|
||||
|
||||
target_sources(LIB_LIEF PRIVATE
|
||||
${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/boost/leaf/all.hpp)
|
||||
|
||||
# =======================================
|
||||
# utfcpp
|
||||
# =======================================
|
||||
if(LIEF_OPT_UTFCPP_EXTERNAL)
|
||||
find_package(utf8cpp REQUIRED)
|
||||
target_link_libraries(LIB_LIEF PRIVATE utf8cpp::utf8cpp)
|
||||
else()
|
||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/internal/)
|
||||
file(COPY ${UTFCPP_INCLUDE_DIR}/
|
||||
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/internal/utfcpp)
|
||||
endif()
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/utfcpp/utf8.h
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -E copy_directory ${UTFCPP_INCLUDE_DIR}/
|
||||
${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/utfcpp
|
||||
DEPENDS lief_utfcpp)
|
||||
|
||||
# =======================================
|
||||
# tcb/span
|
||||
# =======================================
|
||||
if(LIEF_EXTERNAL_SPAN)
|
||||
message(STATUS "Using external tcb/span version")
|
||||
if(LIEF_EXTERNAL_SPAN_DIR)
|
||||
message(STATUS "External span include dir: ${LIEF_EXTERNAL_SPAN_DIR}")
|
||||
target_include_directories(LIB_LIEF SYSTEM PUBLIC
|
||||
"$<BUILD_INTERFACE:${LIEF_EXTERNAL_SPAN_DIR}>")
|
||||
endif()
|
||||
else()
|
||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/internal/)
|
||||
file(COPY ${TCB_SPAN_SRC_DIR}/
|
||||
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/internal/)
|
||||
endif()
|
||||
target_sources(LIB_LIEF PRIVATE
|
||||
${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/third-party/utfcpp/utf8.h)
|
||||
|
||||
|
||||
add_dependencies(LIB_LIEF lief_mbed_tls)
|
||||
target_link_libraries(LIB_LIEF PRIVATE lief_spdlog)
|
||||
|
||||
if(ANDROID AND LIEF_LOGGING)
|
||||
target_link_libraries(LIB_LIEF PUBLIC log)
|
||||
endif()
|
||||
|
||||
# Flags definition
|
||||
# ----------------
|
||||
set_target_properties(LIB_LIEF
|
||||
|
||||
# cmake-format: off
|
||||
set_target_properties(
|
||||
LIB_LIEF
|
||||
PROPERTIES POSITION_INDEPENDENT_CODE ON
|
||||
CXX_STANDARD 17
|
||||
CXX_STANDARD 11
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
VISIBILITY_INLINES_HIDDEN ON
|
||||
CXX_VISIBILITY_PRESET hidden
|
||||
C_VISIBILITY_PRESET hidden)
|
||||
|
||||
if (LIEF_CLANG_TIDY)
|
||||
find_program(CLANG_TIDY_EXE NAMES "clang-tidy" REQUIRED)
|
||||
cmake_path(GET CLANG_TIDY_EXE PARENT_PATH CLANG_TIDY_DIR)
|
||||
|
||||
set(CLANG_TIDY_COMMAND
|
||||
"${CLANG_TIDY_EXE}"
|
||||
"--use-color"
|
||||
"--load=${CLANG_TIDY_DIR}/clang-taidy.so"
|
||||
"--config-file=${CMAKE_CURRENT_SOURCE_DIR}/.clang-tidy-core.yaml"
|
||||
)
|
||||
if (LIEF_CLANG_TIDY_WARN_ERR)
|
||||
list(APPEND CLANG_TIDY_COMMAND "--warnings-as-errors=*")
|
||||
endif()
|
||||
|
||||
set_target_properties(LIB_LIEF PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}")
|
||||
|
||||
if (TARGET LIB_LIEF_RUNTIME)
|
||||
set_target_properties(LIB_LIEF_RUNTIME
|
||||
PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# cmake-format: on
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_options(LIB_LIEF PRIVATE -Wl,--gc-sections -Wl,--exclude-libs,ALL)
|
||||
set_property(
|
||||
TARGET LIB_LIEF
|
||||
APPEND
|
||||
PROPERTY LINK_FLAGS "-Wl,--gc-sections -Wl,--exclude-libs,ALL")
|
||||
endif()
|
||||
|
||||
target_compile_definitions(LIB_LIEF PUBLIC -D_GLIBCXX_USE_CXX11_ABI=1)
|
||||
|
||||
# LIEF Sanitizer options
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# Enable support for MD2 and MD4 for parsing the Authenticode sigs of older
|
||||
# executables. Also, some older signed executables use certs with the
|
||||
# SpcSpAgencyInfo Critical Extension, which mbed TLS doesn't support, so set
|
||||
# MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION to have it skip this
|
||||
# extension.
|
||||
add_definitions(-DMBEDTLS_MD2_C -DMBEDTLS_MD4_C -DMBEDTLS_PEM_PARSE_C
|
||||
-DMBEDTLS_X509_CRT_PARSE_C -DMBEDTLS_PEM_WRITE_C
|
||||
-DMBEDTLS_PKCS1_V15 -DMBEDTLS_PKCS1_V21
|
||||
-DMBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION)
|
||||
|
||||
# ASAN - LSAN - TSAN - USAN
|
||||
# ~~~
|
||||
set(SANITIZER_FLAGS -fno-omit-frame-pointer -g -O1)
|
||||
if(LIEF_ASAN)
|
||||
message(STATUS "Address sanitizer enabled")
|
||||
list(APPEND SANITIZER_FLAGS
|
||||
-fsanitize=address
|
||||
-fsanitize-address-use-after-scope
|
||||
-fsanitize-address-use-after-return=runtime
|
||||
)
|
||||
list(APPEND SANITIZER_FLAGS -fsanitize=address)
|
||||
|
||||
target_link_options(LIB_LIEF PUBLIC -fsanitize=address)
|
||||
set_property(
|
||||
TARGET LIB_LIEF
|
||||
APPEND
|
||||
PROPERTY LINK_FLAGS -fsanitize=address)
|
||||
target_link_libraries(LIB_LIEF INTERFACE asan)
|
||||
endif()
|
||||
|
||||
if(LIEF_LSAN)
|
||||
message(STATUS "Leak sanitizer enabled")
|
||||
list(APPEND SANITIZER_FLAGS -fsanitize=leak)
|
||||
|
||||
target_link_options(LIB_LIEF PUBLIC -fsanitize=leak)
|
||||
set_property(
|
||||
TARGET LIB_LIEF
|
||||
APPEND
|
||||
PROPERTY LINK_FLAGS -fsanitize=leak)
|
||||
|
||||
target_link_libraries(LIB_LIEF INTERFACE lsan)
|
||||
endif()
|
||||
@@ -373,58 +419,76 @@ if(LIEF_TSAN)
|
||||
message(STATUS "Thread sanitizer enabled")
|
||||
list(APPEND SANITIZER_FLAGS -fsanitize=thread)
|
||||
|
||||
target_link_options(LIB_LIEF PUBLIC -fsanitize=thread)
|
||||
set_property(
|
||||
TARGET LIB_LIEF
|
||||
APPEND
|
||||
PROPERTY LINK_FLAGS -fsanitize=thread)
|
||||
|
||||
target_link_libraries(LIB_LIEF INTERFACE tsan)
|
||||
endif()
|
||||
|
||||
if(LIEF_USAN)
|
||||
message(STATUS "Undefined sanitizer enabled")
|
||||
list(APPEND SANITIZER_FLAGS -fsanitize=undefined,null,alignment)
|
||||
list(APPEND SANITIZER_FLAGS -fsanitize=undefined)
|
||||
|
||||
target_link_options(LIB_LIEF PUBLIC -fsanitize=undefined,null,alignment)
|
||||
set_property(
|
||||
TARGET LIB_LIEF
|
||||
APPEND
|
||||
PROPERTY LINK_FLAGS -fsanitize=undefined)
|
||||
|
||||
target_link_libraries(LIB_LIEF PUBLIC ubsan)
|
||||
target_link_libraries(LIB_LIEF INTERFACE ubsan)
|
||||
endif()
|
||||
|
||||
set(LIEF_SANITIZER OFF)
|
||||
if(LIEF_ASAN OR LIEF_LSAN OR LIEF_TSAN OR LIEF_USAN)
|
||||
set(LIEF_SANITIZER ON)
|
||||
if(LIEF_ASAN
|
||||
OR LIEF_LSAN
|
||||
OR LIEF_TSAN
|
||||
OR LIEF_USAN)
|
||||
target_compile_options(LIB_LIEF PRIVATE ${SANITIZER_FLAGS})
|
||||
endif()
|
||||
|
||||
if(LIEF_SANITIZER)
|
||||
message("LIEF Sanitizer enabled: ${SANITIZER_FLAGS}")
|
||||
target_compile_options(LIB_LIEF PUBLIC ${SANITIZER_FLAGS})
|
||||
add_subdirectory(tests/sanitizer)
|
||||
endif()
|
||||
|
||||
# Fuzzing options
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# Fuzzing
|
||||
# ~~~
|
||||
if(LIEF_FUZZING)
|
||||
set(FUZZING_FLAGS -fno-omit-frame-pointer -g -O2 -fsanitize=fuzzer-no-link)
|
||||
target_link_options(LIB_LIEF PUBLIC -fsanitize=fuzzer-no-link)
|
||||
set_property(
|
||||
TARGET LIB_LIEF
|
||||
APPEND
|
||||
PROPERTY LINK_FLAGS ${FUZZING_LINKER_FLAGS})
|
||||
|
||||
target_compile_options(LIB_LIEF PRIVATE ${FUZZING_FLAGS})
|
||||
target_link_libraries(LIB_LIEF PUBLIC pthread)
|
||||
add_subdirectory(fuzzing)
|
||||
|
||||
target_link_libraries(LIB_LIEF asan pthread)
|
||||
|
||||
add_dependencies(LIB_LIEF lief_libfuzzer)
|
||||
endif()
|
||||
|
||||
# Compile Flags
|
||||
# =============
|
||||
include(LIEFCompilerFlags)
|
||||
|
||||
# Profiling flags
|
||||
# ---------------
|
||||
if(LIEF_PROFILING)
|
||||
add_subdirectory(profiling)
|
||||
set(PROFILING_FLAGS
|
||||
-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc
|
||||
-fno-builtin-free -fno-omit-frame-pointer -g)
|
||||
target_compile_options(LIB_LIEF PUBLIC ${PROFILING_FLAGS})
|
||||
|
||||
add_executable(elf_profiler profiling/elf_profiler.cpp)
|
||||
target_compile_options(elf_profiler PUBLIC ${PROFILING_FLAGS})
|
||||
target_link_libraries(elf_profiler PRIVATE LIB_LIEF)
|
||||
endif()
|
||||
|
||||
set_target_properties(LIB_LIEF PROPERTIES
|
||||
OUTPUT_NAME LIEF
|
||||
EXPORT_NAME LIEF
|
||||
CLEAN_DIRECT_OUTPUT 1)
|
||||
|
||||
if (LIEF_SO_VERSION)
|
||||
set_target_properties(LIB_LIEF PROPERTIES
|
||||
VERSION "${LIEF_VERSION_MAJOR}.${LIEF_VERSION_MINOR}.${LIEF_VERSION_PATCH}"
|
||||
SOVERSION "${LIEF_VERSION_MAJOR}"
|
||||
)
|
||||
# Coverage flags
|
||||
# --------------
|
||||
if(LIEF_COVERAGE)
|
||||
target_compile_options(LIB_LIEF PRIVATE -g -O0 --coverage -fprofile-arcs
|
||||
-ftest-coverage)
|
||||
target_link_libraries(LIB_LIEF gcov)
|
||||
endif()
|
||||
|
||||
set_target_properties(LIB_LIEF PROPERTIES OUTPUT_NAME LIEF CLEAN_DIRECT_OUTPUT 1)
|
||||
|
||||
|
||||
# Set a default build type if none was specified
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
message(STATUS "Setting build type to 'Release' as none was specified.")
|
||||
@@ -433,35 +497,58 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
CACHE STRING "Choose the type of build." FORCE)
|
||||
# Set the possible values of build type for cmake-gui
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
|
||||
"MinSizeRel" "RelWithDebInfo")
|
||||
"MinSizeRel" "RelWithDebInfo")
|
||||
endif()
|
||||
|
||||
message(STATUS "Configuration Types: ${CMAKE_CONFIGURATION_TYPES}")
|
||||
message(STATUS "Build Types: ${CMAKE_BUILD_TYPE}")
|
||||
message(STATUS "Build Types: ${CMAKE_BUILD_TYPE}")
|
||||
|
||||
if(APPLE)
|
||||
set_target_properties(LIB_LIEF PROPERTIES MACOSX_RPATH ON)
|
||||
set_target_properties(LIB_LIEF PROPERTIES
|
||||
MACOSX_RPATH ON
|
||||
)
|
||||
endif()
|
||||
|
||||
add_subdirectory(api)
|
||||
# API
|
||||
# ======================
|
||||
include(LIEFApi)
|
||||
|
||||
# Examples
|
||||
# ======================
|
||||
if(LIEF_EXAMPLES)
|
||||
add_subdirectory(examples)
|
||||
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/examples")
|
||||
endif()
|
||||
|
||||
# Tests
|
||||
# ======================
|
||||
|
||||
if(LIEF_TESTS)
|
||||
enable_testing()
|
||||
add_subdirectory(tests)
|
||||
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/tests")
|
||||
endif()
|
||||
|
||||
if(LIEF_COMPILE_DOC_EXAMPLES)
|
||||
add_subdirectory(doc/code/cpp)
|
||||
# Documentation
|
||||
# ======================
|
||||
if(LIEF_DOC)
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/doc)
|
||||
endif()
|
||||
|
||||
# Find Package Config
|
||||
# ======================
|
||||
configure_package_config_file(
|
||||
LIEFConfig.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/LIEFConfig.cmake
|
||||
INSTALL_DESTINATION share/LIEF/cmake)
|
||||
|
||||
write_basic_package_version_file(
|
||||
${CMAKE_CURRENT_BINARY_DIR}/LIEFConfigVersion.cmake
|
||||
VERSION ${PROJECT_VERSION}
|
||||
COMPATIBILITY AnyNewerVersion)
|
||||
|
||||
# Post-build operations
|
||||
# ======================
|
||||
if(BUILD_SHARED_LIBS AND CMAKE_BUILD_TYPE MATCHES "Release")
|
||||
if(UNIX AND NOT APPLE)
|
||||
if (BUILD_SHARED_LIBS AND CMAKE_BUILD_TYPE MATCHES "Release")
|
||||
if (UNIX AND NOT APPLE)
|
||||
add_custom_command(
|
||||
TARGET LIB_LIEF
|
||||
COMMENT "Strip LIEF shared library"
|
||||
@@ -470,7 +557,7 @@ if(BUILD_SHARED_LIBS AND CMAKE_BUILD_TYPE MATCHES "Release")
|
||||
)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
if (APPLE)
|
||||
add_custom_command(
|
||||
TARGET LIB_LIEF
|
||||
COMMENT "Strip LIEF shared library"
|
||||
@@ -480,78 +567,55 @@ if(BUILD_SHARED_LIBS AND CMAKE_BUILD_TYPE MATCHES "Release")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Generate install target and package
|
||||
# =======================================
|
||||
if(LIEF_INSTALL)
|
||||
|
||||
# Find Package Config
|
||||
# ======================
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/LIEFConfig.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/LIEFConfig.cmake @ONLY)
|
||||
|
||||
write_basic_package_version_file(
|
||||
${CMAKE_CURRENT_BINARY_DIR}/LIEFConfigVersion.cmake
|
||||
VERSION ${PROJECT_VERSION}
|
||||
COMPATIBILITY AnyNewerVersion)
|
||||
|
||||
# Install Prefix
|
||||
# ======================
|
||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND UNIX)
|
||||
if(UNIX AND NOT APPLE)
|
||||
set(CMAKE_INSTALL_PREFIX
|
||||
"/usr"
|
||||
CACHE PATH "Install path prefix prepended on to install directories."
|
||||
FORCE)
|
||||
elseif(APPLE)
|
||||
set(CMAKE_INSTALL_PREFIX
|
||||
"/usr/local"
|
||||
CACHE PATH "" FORCE)
|
||||
endif()
|
||||
# Install Prefix
|
||||
# ======================
|
||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND UNIX)
|
||||
if(UNIX AND NOT APPLE)
|
||||
set(CMAKE_INSTALL_PREFIX
|
||||
"/usr"
|
||||
CACHE PATH "Install path prefix prepended on to install directories."
|
||||
FORCE)
|
||||
elseif(APPLE)
|
||||
set(CMAKE_INSTALL_PREFIX
|
||||
"/usr/local"
|
||||
CACHE PATH "" FORCE)
|
||||
endif()
|
||||
|
||||
install(
|
||||
TARGETS LIB_LIEF lief_spdlog
|
||||
EXPORT LIEFExport
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries
|
||||
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
|
||||
install(
|
||||
DIRECTORY ${LIEF_PUBLIC_INCLUDE_DIR}
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||
COMPONENT headers
|
||||
FILES_MATCHING
|
||||
REGEX "(.*).(hpp|h|def|inc)$")
|
||||
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/LIEFConfig.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/LIEFConfigVersion.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/LIEF
|
||||
COMPONENT config)
|
||||
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/LIEF.pc
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
||||
COMPONENT libraries)
|
||||
|
||||
if(BUILD_SHARED_LIBS)
|
||||
set(lib_type shared)
|
||||
else()
|
||||
set(lib_type static)
|
||||
endif()
|
||||
|
||||
install(
|
||||
EXPORT LIEFExport
|
||||
NAMESPACE LIEF::
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/LIEF
|
||||
FILE LIEFExport-${lib_type}.cmake
|
||||
COMPONENT config)
|
||||
|
||||
export(
|
||||
EXPORT LIEFExport
|
||||
NAMESPACE LIEF::
|
||||
FILE LIEFExport-${lib_type}.cmake)
|
||||
|
||||
add_subdirectory(package)
|
||||
endif()
|
||||
|
||||
# Installation
|
||||
# ======================
|
||||
|
||||
install(
|
||||
TARGETS LIB_LIEF
|
||||
ARCHIVE DESTINATION lib
|
||||
LIBRARY DESTINATION lib
|
||||
RUNTIME DESTINATION lib COMPONENT libraries)
|
||||
|
||||
install(
|
||||
DIRECTORY ${LIEF_PUBLIC_INCLUDE_DIR}
|
||||
DESTINATION include
|
||||
COMPONENT headers
|
||||
FILES_MATCHING
|
||||
REGEX "(.*).(hpp|h|def)$")
|
||||
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/FindLIEF.cmake
|
||||
DESTINATION share/LIEF/cmake
|
||||
COMPONENT CMakeScripts)
|
||||
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/LIEFConfig.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/LIEFConfigVersion.cmake
|
||||
DESTINATION share/LIEF/cmake
|
||||
COMPONENT config)
|
||||
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/LIEF.pc
|
||||
DESTINATION lib/pkgconfig
|
||||
COMPONENT libraries)
|
||||
|
||||
export(TARGETS LIB_LIEF lief_spdlog FILE LIEFExport.cmake)
|
||||
|
||||
# Package
|
||||
# ======================
|
||||
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/package")
|
||||
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
# Docker file used to compile LIEF on Linux x86-64 compliant with Python tag: manylinux1
|
||||
# docker build -t liefproject/manylinux1_x86_64:latest -f ./Dockerfile .
|
||||
FROM quay.io/pypa/manylinux1_x86_64:2020-12-30-e2b3664
|
||||
|
||||
RUN yum update -y \
|
||||
&& yum install -y ccache \
|
||||
&& yum clean all
|
||||
|
||||
RUN /opt/python/cp37-cp37m/bin/pip install cmake==3.13.3 ninja==1.10.0.post2
|
||||
ENV PATH=$PATH:/opt/python/cp37-cp37m/bin/
|
||||
|
||||
RUN curl --output /tmp/gcc-6.3.0-binutils-2.27-x86_64.tar.bz2 -L https://github.com/squeaky-pl/centos-devtools/releases/download/6.3/gcc-6.3.0-binutils-2.27-x86_64.tar.bz2 && \
|
||||
echo "ca3e9f92411507018c839c8cc2b496f14956a49fcf6df0cdcb356de7161bcbc5 /tmp/gcc-6.3.0-binutils-2.27-x86_64.tar.bz2" | sha256sum --check --status && \
|
||||
tar -C / -xj -f /tmp/gcc-6.3.0-binutils-2.27-x86_64.tar.bz2 && \
|
||||
rm -rf /tmp/gcc-6.3.0-binutils-2.27-x86_64.tar.bz2
|
||||
|
||||
ENV CC=/opt/devtools-6.3/bin/gcc
|
||||
ENV CXX=/opt/devtools-6.3/bin/g++
|
||||
ENV CXXFLAGS="-static-libstdc++ -static-libgcc"
|
||||
|
||||
WORKDIR /src
|
||||
@@ -186,8 +186,8 @@
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2017 - 2026 R. Thomas
|
||||
Copyright 2017 - 2026 Quarkslab
|
||||
Copyright 2017 - 2021 R. Thomas
|
||||
Copyright 2017 - 2021 Quarkslab
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
set(LIEF_DIR "${PACKAGE_PREFIX_DIR}")
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/FindLIEF.cmake")
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
include README.md LICENSE setup.cfg CMakeLists.txt LIEF.pc.in LIEFConfig.cmake.in
|
||||
|
||||
# Examples
|
||||
recursive-include examples *
|
||||
|
||||
# LIEF Sources
|
||||
recursive-include src *
|
||||
recursive-include include *
|
||||
|
||||
recursive-include third-party *
|
||||
recursive-include cmake *
|
||||
recursive-include scripts *
|
||||
|
||||
# Bindings
|
||||
recursive-include api *
|
||||
prune api/python/build
|
||||
|
||||
# Global exclude
|
||||
recursive-exclude *.egg-info *.so
|
||||
|
||||
# Install script
|
||||
recursive-include package *
|
||||
|
||||
# Documentation
|
||||
recursive-include doc *
|
||||
|
||||
@@ -1,132 +1,116 @@
|
||||
<p align="center" >
|
||||
<img width="90%" src="https://github.com/lief-project/LIEF/blob/main/.github/images/architecture.png"/><br />
|
||||
<img width="90%" src="https://github.com/lief-project/LIEF/blob/master/.github/images/architecture.png"/><br />
|
||||
</p>
|
||||
<br />
|
||||
|
||||
<p align="center">
|
||||
<a href="https://lief.re/blog/"><b>Blog</b></a> •
|
||||
<a href="https://lief.re/doc/latest/index.html"><b>Documentation</b></a> •
|
||||
<a href="#user-content-about-1"><b>About</b></a>
|
||||
<a href="https://gitter.im/lief-project">
|
||||
<img src="https://img.shields.io/gitter/room/gitterHQ/gitter.svg?style=flat-square">
|
||||
</a>
|
||||
|
||||
<a href="https://travis-ci.com/lief-project/LIEF">
|
||||
<img alt="Linux CI status" src="https://img.shields.io/travis/com/lief-project/LIEF/master?label=Linux%20x86-64&logo=travis">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/lief-project/LIEF/actions?query=workflow%3A%22Linux+AArch64%22">
|
||||
<img alt="Linux AArch64 CI status" src="https://img.shields.io/github/workflow/status/lief-project/LIEF/Linux%20AArch64/master?label=Linux%20AArch64&logo=github">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/lief-project/LIEF/actions?query=workflow%3AAndroid">
|
||||
<img alt="Android CI status" src="https://img.shields.io/github/workflow/status/lief-project/LIEF/Android/master?label=Android&logo=github">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/lief-project/LIEF/actions?query=workflow%3AmacOS">
|
||||
<img alt="macOS CI status" src="https://img.shields.io/github/workflow/status/lief-project/LIEF/macOS/master?label=macOS&logo=github">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/lief-project/LIEF/actions?query=workflow%3AiOS">
|
||||
<img alt="iOS CI status" src="https://img.shields.io/github/workflow/status/lief-project/LIEF/iOS/master?label=iOS&logo=github">
|
||||
</a>
|
||||
|
||||
<a href="https://ci.appveyor.com/project/Romain/lief/branch/master">
|
||||
<img alt="Windows CI status" src="https://img.shields.io/appveyor/build/Romain/LIEF/master?label=Windows&logo=appveyor">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/lief-project/LIEF/releases">
|
||||
<img src="https://img.shields.io/github/v/release/lief-project/LIEF?style=flat-square">
|
||||
</a>
|
||||
|
||||
<a href="https://twitter.com/LIEF_project">
|
||||
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/lief_project?color=1da1f2&label=Follow&logo=twitter&logoColor=white&style=flat-square">
|
||||
</a>
|
||||
|
||||
</p>
|
||||
<br />
|
||||
|
||||
# About
|
||||
|
||||
The purpose of this project is to provide a cross-platform library to parse,
|
||||
modify and abstract ELF, PE and MachO formats.
|
||||
The purpose of this project is to provide a cross platform library which can parse, modify and abstract ELF, PE and MachO formats.
|
||||
|
||||
**Main features**:
|
||||
Main features:
|
||||
|
||||
* **Parsing**: LIEF can parse [ELF](https://lief.re/doc/latest/formats/elf/index.html), [PE](https://lief.re/doc/latest/formats/pe/index.html), [MachO](https://lief.re/doc/latest/formats/macho/index.html), [COFF](https://lief.re/doc/latest/formats/coff/index.html), OAT, DEX, VDEX, ART and provides a user-friendly API to access their internals.
|
||||
* **Modify**: LIEF can be used to modify some parts of these formats (adding a section, changing a symbol's name, ...)
|
||||
* **Parsing**: LIEF can parse ELF, PE, MachO, OAT, DEX, VDEX, ART and provides an user-friendly API to access to format internals.
|
||||
* **Modify**: LIEF enables to modify some parts of these formats
|
||||
* **Abstract**: Three formats have common features like sections, symbols, entry point... LIEF factors them.
|
||||
* **API**: You can use LIEF via [C++](https://lief.re/doc/latest/doxygen/), Python, [Rust](https://lief-rs.s3.fr-par.scw.cloud/doc/latest/lief/index.html), and
|
||||
[Node.js](https://github.com/Piebald-AI/node-lief) (unofficial, AI-generated)
|
||||
|
||||
**Extended features**:
|
||||
|
||||
* [**Runtime**](https://lief.re/doc/latest/runtime/intro.html)
|
||||
* [**DWARF/PDB** Support](https://lief.re/doc/latest/extended/debug_info/index.html)
|
||||
* [**Objective-C** Metadata](https://lief.re/doc/latest/extended/objc/index.html)
|
||||
* [**Dyld Shared Cache**](https://lief.re/doc/latest/extended/dsc/index.html) with support for extracting Dylib
|
||||
* [**Disassembler**](https://lief.re/doc/latest/extended/disassembler/index.html): AArch64, x86/x86-64, ARM, RISC-V, Mips, PowerPC, eBPF
|
||||
* [**Assembler**](https://lief.re/doc/latest/extended/assembler/index.html): AArch64, x86/x86-64, RISC-V
|
||||
|
||||
**Plugins**:
|
||||
|
||||
* [**Ghidra**](https://lief.re/doc/latest/plugins/ghidra/index.html)
|
||||
* [**BinaryNinja**](https://lief.re/doc/latest/plugins/binaryninja/index.html)
|
||||
|
||||
# Sponsors
|
||||
|
||||
<br />
|
||||
<p align="center">
|
||||
<a href="https://quansight.com/" target="_blank">
|
||||
<img width="300px" src="https://lief.re/quansight_logo.jpg"/><br />
|
||||
</a>
|
||||
</p>
|
||||
* **API**: LIEF can be used in C, C++ and Python
|
||||
|
||||
# Content
|
||||
|
||||
- [About](#about)
|
||||
- [Downloads / Install](#downloads--install)
|
||||
- [Download / Install](#downloads--install)
|
||||
- [Getting started](#getting-started)
|
||||
- [Blog](https://lief.re/blog/)
|
||||
- [Documentation](#documentation)
|
||||
- [Rust](https://lief.re/doc/stable/rust/lief/)
|
||||
- [Sphinx](https://lief.re/doc/latest/index.html)
|
||||
- [Doxygen](https://lief.re/doc/latest/doxygen/index.html)
|
||||
- [Sphinx](https://lief.quarkslab.com/doc/stable/index.html)
|
||||
- [Doxygen](https://lief.quarkslab.com/doc/latest/doxygen/index.html)
|
||||
- Tutorials:
|
||||
- [Parse and manipulate formats](https://lief.re/doc/latest/tutorials/01_play_with_formats.html)
|
||||
- [Play with ELF symbols](https://lief.re/doc/latest/tutorials/03_elf_change_symbols.html)
|
||||
- [PE Resources](https://lief.re/doc/latest/tutorials/07_pe_resource.html)
|
||||
- [Transforming an ELF executable into a library](https://lief.re/doc/latest/tutorials/08_elf_bin2lib.html)
|
||||
- [How to use frida on a non-rooted device](https://lief.re/doc/latest/tutorials/09_frida_lief.html)
|
||||
- [Android formats](https://lief.re/doc/latest/tutorials/10_android_formats.html)
|
||||
- [Mach-O modification](https://lief.re/doc/latest/tutorials/11_macho_modification.html)
|
||||
- [ELF Coredump](https://lief.re/doc/latest/tutorials/12_elf_coredump.html)
|
||||
- [PE Authenticode](https://lief.re/doc/latest/tutorials/13_pe_authenticode.html)
|
||||
- [Parse and manipulate formats](https://lief.quarkslab.com/doc/latest/tutorials/01_play_with_formats.html)
|
||||
- [Create a PE from scratch](https://lief.quarkslab.com/doc/latest/tutorials/02_pe_from_scratch.html)
|
||||
- [Play with ELF symbols](https://lief.quarkslab.com/doc/latest/tutorials/03_elf_change_symbols.html)
|
||||
- [ELF Hooking](https://lief.quarkslab.com/doc/latest/tutorials/04_elf_hooking.html)
|
||||
- [Infecting the plt/got](https://lief.quarkslab.com/doc/latest/tutorials/05_elf_infect_plt_got.html)
|
||||
- [PE Hooking](https://lief.quarkslab.com/doc/latest/tutorials/06_pe_hooking.html)
|
||||
- [PE Resources](https://lief.quarkslab.com/doc/latest/tutorials/07_pe_resource.html)
|
||||
- [Transforming an ELF executable into a library](https://lief.quarkslab.com/doc/latest/tutorials/08_elf_bin2lib.html)
|
||||
- [How to use frida on a non-rooted device](https://lief.quarkslab.com/doc/latest/tutorials/09_frida_lief.html)
|
||||
- [Android formats](https://lief.quarkslab.com/doc/latest/tutorials/10_android_formats.html)
|
||||
- [Mach-O modification](https://lief.quarkslab.com/doc/latest/tutorials/11_macho_modification.html)
|
||||
- [ELF Coredump](https://lief.quarkslab.com/doc/latest/tutorials/12_elf_coredump.html)
|
||||
- [PE Authenticode](https://lief.quarkslab.com/doc/latest/tutorials/13_pe_authenticode.html)
|
||||
- [Contact](#contact)
|
||||
- [About](#about-1)
|
||||
- [About](#about)
|
||||
- [Authors](#authors)
|
||||
- [License](#license)
|
||||
- [BibTeX](#bibtex)
|
||||
- [Bibtex](#bibtex)
|
||||
|
||||
## Downloads / Install
|
||||
|
||||
### C++
|
||||
|
||||
```cmake
|
||||
find_package(LIEF REQUIRED)
|
||||
target_link_libraries(my-project LIEF::LIEF)
|
||||
```
|
||||
|
||||
### Rust
|
||||
|
||||
```toml
|
||||
[package]
|
||||
name = "my-awesome-project"
|
||||
version = "0.0.1"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
lief = "1.0.0"
|
||||
```
|
||||
|
||||
### Homebrew
|
||||
First, make sure to have an updated version of setuptools:
|
||||
|
||||
```console
|
||||
brew install lief
|
||||
pip install setuptools --upgrade
|
||||
```
|
||||
|
||||
### Python
|
||||
|
||||
To install the latest **version** (release):
|
||||
|
||||
```console
|
||||
pip install lief
|
||||
```
|
||||
|
||||
To install nightly build:
|
||||
To install nightlty build:
|
||||
|
||||
```console
|
||||
pip install [--user] --force-reinstall --index-url https://lief.s3-website.fr-par.scw.cloud/latest lief==2.0.0.dev0
|
||||
pip install [--user] --index-url https://lief.quarkslab.com/packages lief==0.12.0.dev0
|
||||
```
|
||||
|
||||
### Packages
|
||||
|
||||
- LIEF Extended: https://extended.lief.re (GitHub OAuth)
|
||||
- **Nightly**:
|
||||
* SDK: https://lief.s3-website.fr-par.scw.cloud/latest/sdk
|
||||
* Python Wheels: https://lief.s3-website.fr-par.scw.cloud/latest/lief
|
||||
- **v1.0.0**: https://github.com/lief-project/LIEF/releases/tag/1.0.0
|
||||
* **Nightly**: https://github.com/lief-project/packages/tree/gh-pages
|
||||
* **v0.11.4**: https://github.com/lief-project/LIEF/releases/tag/0.11.4
|
||||
|
||||
Here are guides to install or integrate LIEF:
|
||||
|
||||
* [Python](https://lief.re/doc/latest/installation.html#python)
|
||||
* [Visual Studio](https://lief.re/doc/latest/installation.html#visual-studio-integration)
|
||||
* [Xcode](https://lief.re/doc/latest/installation.html#xcode-integration)
|
||||
* [CMake](https://lief.re/doc/latest/installation.html#cmake-integration)
|
||||
* [Python](https://lief.quarkslab.com/doc/latest/installation.html#python)
|
||||
* [VisualStudio](https://lief.quarkslab.com/doc/latest/installation.html#visual-studio-integration)
|
||||
* [XCode](https://lief.quarkslab.com/doc/latest/installation.html#xcode-integration)
|
||||
* [CMake](https://lief.quarkslab.com/doc/latest/installation.html#cmake-integration)
|
||||
|
||||
## Getting started
|
||||
|
||||
@@ -137,63 +121,45 @@ import lief
|
||||
|
||||
# ELF
|
||||
binary = lief.parse("/usr/bin/ls")
|
||||
for section in binary.sections:
|
||||
print(section.name, section.virtual_address)
|
||||
print(binary)
|
||||
|
||||
# PE
|
||||
binary = lief.parse(r"C:\Windows\explorer.exe")
|
||||
if (rheader := binary.rich_header) is not None:
|
||||
print(rheader.key)
|
||||
binary = lief.parse("C:\\Windows\\explorer.exe")
|
||||
print(binary)
|
||||
|
||||
# Mach-O
|
||||
binary = lief.parse("/usr/bin/ls")
|
||||
if (fixups := binary.dyld_chained_fixups) is not None:
|
||||
print(fixups)
|
||||
```
|
||||
|
||||
### Rust
|
||||
|
||||
```rust
|
||||
use lief::Binary;
|
||||
use lief::pe::debug::Entries::CodeViewPDB;
|
||||
|
||||
if let Some(Binary::PE(pe)) = Binary::parse(path.as_str()) {
|
||||
for entry in pe.debug() {
|
||||
if let CodeViewPDB(pdb_view) = entry {
|
||||
println!("{}", pdb_view.filename());
|
||||
}
|
||||
}
|
||||
}
|
||||
print(binary)
|
||||
```
|
||||
|
||||
### C++
|
||||
|
||||
```cpp
|
||||
#include <iostream>
|
||||
#include <LIEF/LIEF.hpp>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
// ELF
|
||||
if (std::unique_ptr<const LIEF::ELF::Binary> elf = LIEF::ELF::Parser::parse("/bin/ls")) {
|
||||
for (const LIEF::ELF::Section& section : elf->sections()) {
|
||||
std::cout << section.name() << ' ' << section.virtual_address() << '\n';
|
||||
}
|
||||
try {
|
||||
std::unique_ptr<LIEF::ELF::Binary> elf = LIEF::ELF::Parser::parse("/bin/ls");
|
||||
std::cout << *elf << std::endl;
|
||||
} catch (const LIEF::exception& err) {
|
||||
std::cerr << err.what() << std::endl;
|
||||
}
|
||||
|
||||
// PE
|
||||
if (std::unique_ptr<const LIEF::PE::Binary> pe = LIEF::PE::Parser::parse("C:\\Windows\\explorer.exe")) {
|
||||
if (const LIEF::PE::RichHeader* rheader = pe->rich_header()) {
|
||||
std::cout << rheader->key() << '\n';
|
||||
}
|
||||
try {
|
||||
std::unique_ptr<LIEF::PE::Binary> pe = LIEF::PE::Parser::parse("C:\\Windows\\explorer.exe");
|
||||
std::cout << *pe << std::endl;
|
||||
} catch (const LIEF::exception& err) {
|
||||
std::cerr << err.what() << std::endl;
|
||||
}
|
||||
|
||||
// Mach-O
|
||||
if (std::unique_ptr<LIEF::MachO::FatBinary> macho = LIEF::MachO::Parser::parse("/bin/ls")) {
|
||||
for (const LIEF::MachO::Binary& bin : *macho) {
|
||||
if (const LIEF::MachO::DyldChainedFixups* fixups = bin.dyld_chained_fixups()) {
|
||||
std::cout << *fixups << '\n';
|
||||
}
|
||||
}
|
||||
try {
|
||||
std::unique_ptr<LIEF::MachO::FatBinary> macho = LIEF::MachO::Parser::parse("/bin/ls");
|
||||
std::cout << *macho << std::endl;
|
||||
} catch (const LIEF::exception& err) {
|
||||
std::cerr << err.what() << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -201,35 +167,58 @@ int main(int argc, char** argv) {
|
||||
|
||||
```
|
||||
|
||||
### C (Limited API)
|
||||
|
||||
```cpp
|
||||
#include <LIEF/LIEF.h>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
Elf_Binary_t* elf = elf_parse("/usr/bin/ls");
|
||||
|
||||
Elf_Section_t** sections = elf->sections;
|
||||
|
||||
for (size_t i = 0; sections[i] != NULL; ++i) {
|
||||
printf("%s\n", sections[i]->name);
|
||||
}
|
||||
|
||||
elf_binary_destroy(elf);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
* [Main documentation](https://lief.re/doc/latest/index.html)
|
||||
* [Doxygen](https://lief.re/doc/latest/doxygen/index.html)
|
||||
* [Rust](https://lief.re/doc/stable/rust/lief/)
|
||||
* [Main documentation](https://lief.quarkslab.com/doc/latest/index.html)
|
||||
* [Tutorial](https://lief.quarkslab.com/doc/latest/tutorials/index.html)
|
||||
* [API](https://lief.quarkslab.com/doc/latest/api/index.html)
|
||||
* [Doxygen](https://lief.quarkslab.com/doc/latest/doxygen/index.html)
|
||||
|
||||
## Contact
|
||||
|
||||
* **Mail**: contact at lief re
|
||||
* **Discord**: [LIEF](https://discord.gg/7hRFGWYedu)
|
||||
* **Mail**: lief at quarkslab com
|
||||
* **Gitter**: [lief-project](https://gitter.im/lief-project)
|
||||
|
||||
## About
|
||||
|
||||
### Authors
|
||||
|
||||
Romain Thomas ([@rh0main](https://www.romainthomas.fr/)) - Formerly at [Quarkslab](https://www.quarkslab.com)
|
||||
Romain Thomas ([@rh0main](https://twitter.com/rh0main)) - [Quarkslab](https://www.quarkslab.com)
|
||||
|
||||
### License
|
||||
|
||||
[Apache 2.0](https://github.com/lief-project/LIEF/blob/1.0.0/LICENSE).
|
||||
LIEF is provided under the [Apache 2.0 license](https://github.com/lief-project/LIEF/blob/0.11.2/LICENSE).
|
||||
|
||||
### BibTeX
|
||||
### Bibtex
|
||||
|
||||
```bibtex
|
||||
```latex
|
||||
@MISC {LIEF,
|
||||
author = "Romain Thomas",
|
||||
title = "LIEF - Library to Instrument Executable Formats",
|
||||
howpublished = "https://lief.quarkslab.com/",
|
||||
month = "apr",
|
||||
year = "2017"
|
||||
month = "April",
|
||||
year = "2017",
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
if (LIEF_PYTHON_API)
|
||||
add_subdirectory(python)
|
||||
endif()
|
||||
|
||||
if(LIEF_RUST_API)
|
||||
add_subdirectory(rust)
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
include_directories(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include"
|
||||
)
|
||||
|
||||
set(LIEF_C_INCLUDE_FILES
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/LIEF.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/logging.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/types.h"
|
||||
)
|
||||
|
||||
set(LIEF_C_SRC "${CMAKE_CURRENT_LIST_DIR}/logging.cpp")
|
||||
|
||||
if (LIEF_ELF)
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/ELF/CMakeLists.txt")
|
||||
endif()
|
||||
|
||||
if (LIEF_PE)
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/PE/CMakeLists.txt")
|
||||
endif()
|
||||
|
||||
if (LIEF_MACHO)
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/MachO/CMakeLists.txt")
|
||||
endif()
|
||||
|
||||
source_group("Header Files\\C API" FILES ${LIEF_C_INCLUDE_FILES})
|
||||
|
||||
target_sources(LIB_LIEF PRIVATE "${LIEF_C_SRC}" ${LIEF_C_INCLUDE_FILES})
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <cstring>
|
||||
#include "LIEF/ELF/Binary.h"
|
||||
#include "LIEF/ELF/Section.h"
|
||||
#include "LIEF/ELF/Segment.h"
|
||||
#include "LIEF/ELF/Header.h"
|
||||
#include "LIEF/ELF/Symbol.h"
|
||||
|
||||
#include "LIEF/ELF/Parser.hpp"
|
||||
#include "LIEF/ELF/Binary.hpp"
|
||||
|
||||
#include "Section.hpp"
|
||||
#include "Segment.hpp"
|
||||
#include "DynamicEntry.hpp"
|
||||
#include "Symbol.hpp"
|
||||
#include "Header.hpp"
|
||||
#include "Binary.hpp"
|
||||
|
||||
using namespace LIEF::ELF;
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
void init_c_binary(Elf_Binary_t* c_binary, Binary* binary) {
|
||||
c_binary->handler = reinterpret_cast<void*>(binary);
|
||||
c_binary->name = binary->name().c_str();
|
||||
c_binary->type = static_cast<enum LIEF_ELF_ELF_CLASS>(binary->type());
|
||||
c_binary->interpreter = nullptr;
|
||||
if (binary->has_interpreter()) {
|
||||
std::string interp = binary->interpreter();
|
||||
c_binary->interpreter = static_cast<char*>(malloc((interp.size() + 1) * sizeof(char)));
|
||||
std::memcpy(
|
||||
reinterpret_cast<void*>(const_cast<char*>(c_binary->interpreter)),
|
||||
reinterpret_cast<const void*>(interp.data()),
|
||||
interp.size());
|
||||
reinterpret_cast<char*>(const_cast<char*>(c_binary->interpreter))[interp.size()] = '\0';
|
||||
}
|
||||
|
||||
|
||||
init_c_header(c_binary, binary);
|
||||
init_c_sections(c_binary, binary);
|
||||
init_c_segments(c_binary, binary);
|
||||
init_c_dynamic_symbols(c_binary, binary);
|
||||
init_c_static_symbols(c_binary, binary);
|
||||
init_c_dynamic_entries(c_binary, binary);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Elf_Binary_t* elf_parse(const char *file) {
|
||||
Binary* binary = Parser::parse(file).release();
|
||||
Elf_Binary_t* c_binary = static_cast<Elf_Binary_t*>(malloc(sizeof(Elf_Binary_t)));
|
||||
memset(c_binary, 0, sizeof(Elf_Binary_t));
|
||||
init_c_binary(c_binary, binary);
|
||||
return c_binary;
|
||||
}
|
||||
|
||||
// Binary Methods
|
||||
// ==============
|
||||
|
||||
int elf_binary_save_header(Elf_Binary_t* binary) {
|
||||
Header& hdr = reinterpret_cast<Binary*>(binary->handler)->header();
|
||||
|
||||
hdr.file_type(static_cast<LIEF::ELF::E_TYPE>(binary->header.file_type));
|
||||
hdr.machine_type(static_cast<LIEF::ELF::ARCH>(binary->header.machine_type));
|
||||
hdr.object_file_version(static_cast<LIEF::ELF::VERSION>(binary->header.object_file_version));
|
||||
hdr.program_headers_offset(binary->header.program_headers_offset);
|
||||
hdr.section_headers_offset(binary->header.section_headers_offset);
|
||||
hdr.processor_flag(binary->header.processor_flags);
|
||||
hdr.header_size(binary->header.header_size);
|
||||
hdr.program_header_size(binary->header.program_header_size);
|
||||
hdr.numberof_segments(binary->header.numberof_segments);
|
||||
hdr.section_header_size(binary->header.section_header_size);
|
||||
hdr.numberof_sections(binary->header.numberof_sections);
|
||||
hdr.section_name_table_idx(binary->header.name_string_table_idx);
|
||||
hdr.entrypoint(binary->header.entrypoint);
|
||||
|
||||
//TODO: identity
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void elf_binary_destroy(Elf_Binary_t* binary) {
|
||||
destroy_sections(binary);
|
||||
destroy_segments(binary);
|
||||
destroy_dynamic_symbols(binary);
|
||||
destroy_static_symbols(binary);
|
||||
destroy_dynamic_entries(binary);
|
||||
|
||||
if (binary->interpreter != nullptr) {
|
||||
free(const_cast<char*>(binary->interpreter));
|
||||
}
|
||||
|
||||
delete reinterpret_cast<Binary*>(binary->handler);
|
||||
free(binary);
|
||||
|
||||
}
|
||||
//}
|
||||
@@ -0,0 +1,30 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_ELF_BINARY_CPP_C_API_
|
||||
#define LIEF_ELF_BINARY_CPP_C_API_
|
||||
|
||||
#include "LIEF/ELF/Binary.h"
|
||||
#include "LIEF/ELF/Binary.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_binary(Elf_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,45 @@
|
||||
include_directories(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include"
|
||||
)
|
||||
|
||||
set(LIEF_C_ELF_SRC
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Symbol.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Section.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Segment.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/DynamicEntry.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Header.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Binary.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EnumToString.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/utils.cpp"
|
||||
)
|
||||
|
||||
|
||||
set(LIEF_API_C_ELF_INCLUDE_FILES_CPP
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Binary.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/DynamicEntry.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Header.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Section.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Segment.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Symbol.hpp"
|
||||
)
|
||||
|
||||
set(LIEF_API_C_ELF_INCLUDE_FILES_C
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/Binary.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/DynamicEntry.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/EnumToString.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/Header.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/Section.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/Segment.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/Symbol.h"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/ELF/structures.h"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/ELF/enums.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/utils.h"
|
||||
)
|
||||
|
||||
set(LIEF_C_ELF_INC "${LIEF_API_C_ELF_INCLUDE_FILES_C}" "${LIEF_API_C_ELF_INCLUDE_FILES_CPP}")
|
||||
|
||||
source_group("Source Files\\C API\\ELF" FILES ${LIEF_API_C_ELF_SRC})
|
||||
source_group("Header Files\\C API\\ELF" FILES ${LIEF_C_ELF_INC})
|
||||
|
||||
target_sources(LIB_LIEF PRIVATE "${LIEF_C_ELF_SRC}" "${LIEF_C_ELF_INC}")
|
||||
@@ -0,0 +1,238 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "DynamicEntry.hpp"
|
||||
|
||||
#include "LIEF/ELF/DynamicEntryFlags.hpp"
|
||||
#include "LIEF/ELF/DynamicSharedObject.hpp"
|
||||
#include "LIEF/ELF/DynamicEntryLibrary.hpp"
|
||||
#include "LIEF/ELF/DynamicEntryRpath.hpp"
|
||||
#include "LIEF/ELF/DynamicEntryRunPath.hpp"
|
||||
#include "LIEF/ELF/DynamicEntryArray.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_dynamic_entries(Elf_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
it_dynamic_entries dyn_entries = binary->dynamic_entries();
|
||||
c_binary->dynamic_entries = static_cast<Elf_DynamicEntry_t**>(
|
||||
malloc((dyn_entries.size() + 1) * sizeof(Elf_DynamicEntry_t**)));
|
||||
|
||||
for (size_t i = 0; i < dyn_entries.size(); ++i) {
|
||||
DynamicEntry& entry = dyn_entries[i];
|
||||
switch(entry.tag()) {
|
||||
case DYNAMIC_TAGS::DT_NEEDED:
|
||||
{
|
||||
|
||||
Elf_DynamicEntry_Library_t* e = static_cast<Elf_DynamicEntry_Library_t*>(
|
||||
malloc(sizeof(Elf_DynamicEntry_Library_t)));
|
||||
|
||||
e->tag = static_cast<enum LIEF_ELF_DYNAMIC_TAGS>(entry.tag());
|
||||
e->value = entry.value();
|
||||
e->name = dynamic_cast<DynamicEntryLibrary*>(&entry)->name().c_str();
|
||||
|
||||
c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_SONAME:
|
||||
{
|
||||
Elf_DynamicEntry_SharedObject_t* e = static_cast<Elf_DynamicEntry_SharedObject_t*>(
|
||||
malloc(sizeof(Elf_DynamicEntry_SharedObject_t)));
|
||||
|
||||
e->tag = static_cast<enum LIEF_ELF_DYNAMIC_TAGS>(entry.tag());
|
||||
e->value = entry.value();
|
||||
e->name = dynamic_cast<DynamicSharedObject*>(&entry)->name().c_str();
|
||||
|
||||
c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_RPATH:
|
||||
{
|
||||
Elf_DynamicEntry_Rpath_t* e = static_cast<Elf_DynamicEntry_Rpath_t*>(
|
||||
malloc(sizeof(Elf_DynamicEntry_Rpath_t)));
|
||||
|
||||
e->tag = static_cast<enum LIEF_ELF_DYNAMIC_TAGS>(entry.tag());
|
||||
e->value = entry.value();
|
||||
e->rpath = dynamic_cast<DynamicEntryRpath*>(&entry)->name().c_str();
|
||||
|
||||
c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_RUNPATH:
|
||||
{
|
||||
Elf_DynamicEntry_RunPath_t* e = static_cast<Elf_DynamicEntry_RunPath_t*>(
|
||||
malloc(sizeof(Elf_DynamicEntry_RunPath_t)));
|
||||
|
||||
e->tag = static_cast<enum LIEF_ELF_DYNAMIC_TAGS>(entry.tag());
|
||||
e->value = entry.value();
|
||||
e->runpath = dynamic_cast<DynamicEntryRunPath*>(&entry)->name().c_str();
|
||||
|
||||
c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_INIT_ARRAY:
|
||||
case DYNAMIC_TAGS::DT_FINI_ARRAY:
|
||||
case DYNAMIC_TAGS::DT_PREINIT_ARRAY:
|
||||
{
|
||||
Elf_DynamicEntry_Array_t* e = static_cast<Elf_DynamicEntry_Array_t*>(
|
||||
malloc(sizeof(Elf_DynamicEntry_Array_t)));
|
||||
|
||||
e->tag = static_cast<enum LIEF_ELF_DYNAMIC_TAGS>(entry.tag());
|
||||
e->value = entry.value();
|
||||
const std::vector<uint64_t>& array = dynamic_cast<DynamicEntryArray*>(&entry)->array();
|
||||
e->array = static_cast<uint64_t*>(malloc((array.size() + 1) * sizeof(uint64_t)));
|
||||
for (size_t i = 0; i < array.size(); ++i) {
|
||||
e->array[i] = array[i];
|
||||
}
|
||||
e->array[array.size()] = 0;
|
||||
c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_FLAGS:
|
||||
{
|
||||
Elf_DynamicEntry_Flags_t* e = static_cast<Elf_DynamicEntry_Flags_t*>(
|
||||
malloc(sizeof(Elf_DynamicEntry_Flags_t)));
|
||||
|
||||
e->tag = static_cast<enum LIEF_ELF_DYNAMIC_TAGS>(entry.tag());
|
||||
e->value = entry.value();
|
||||
const DynamicEntryFlags::flags_list_t& flags = dynamic_cast<DynamicEntryFlags*>(&entry)->flags();
|
||||
e->flags = static_cast<enum LIEF_ELF_DYNAMIC_FLAGS*>(malloc((flags.size() + 1) * sizeof(enum LIEF_ELF_DYNAMIC_FLAGS)));
|
||||
e->flags_1 = nullptr;
|
||||
|
||||
auto&& it = std::begin(flags);
|
||||
|
||||
for (size_t i = 0; it != std::end(flags); ++i, ++it) {
|
||||
e->flags[i] = static_cast<enum LIEF_ELF_DYNAMIC_FLAGS>(*it);
|
||||
}
|
||||
|
||||
e->flags[flags.size()] = static_cast<enum LIEF_ELF_DYNAMIC_FLAGS>(0);
|
||||
c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_FLAGS_1:
|
||||
{
|
||||
Elf_DynamicEntry_Flags_t* e = static_cast<Elf_DynamicEntry_Flags_t*>(
|
||||
malloc(sizeof(Elf_DynamicEntry_Flags_t)));
|
||||
|
||||
e->tag = static_cast<enum LIEF_ELF_DYNAMIC_TAGS>(entry.tag());
|
||||
e->value = entry.value();
|
||||
const DynamicEntryFlags::flags_list_t& flags = dynamic_cast<DynamicEntryFlags*>(&entry)->flags();
|
||||
e->flags_1 = static_cast<enum LIEF_ELF_DYNAMIC_FLAGS_1*>(malloc((flags.size() + 1) * sizeof(enum LIEF_ELF_DYNAMIC_FLAGS_1)));
|
||||
e->flags = nullptr;
|
||||
|
||||
auto&& it = std::begin(flags);
|
||||
|
||||
for (size_t i = 0; it != std::end(flags); ++i, ++it) {
|
||||
e->flags_1[i] = static_cast<enum LIEF_ELF_DYNAMIC_FLAGS_1>(*it);
|
||||
}
|
||||
|
||||
e->flags_1[flags.size()] = static_cast<enum LIEF_ELF_DYNAMIC_FLAGS_1>(0);
|
||||
c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
default:
|
||||
{
|
||||
c_binary->dynamic_entries[i] =
|
||||
static_cast<Elf_DynamicEntry_t*>(malloc(sizeof(Elf_DynamicEntry_t)));
|
||||
c_binary->dynamic_entries[i]->tag = static_cast<enum LIEF_ELF_DYNAMIC_TAGS>(entry.tag());
|
||||
c_binary->dynamic_entries[i]->value = entry.value();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
c_binary->dynamic_entries[dyn_entries.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_dynamic_entries(Elf_Binary_t* c_binary) {
|
||||
|
||||
Elf_DynamicEntry_t **dynamic_entries = c_binary->dynamic_entries;
|
||||
for (size_t idx = 0; dynamic_entries[idx] != NULL; ++idx) {
|
||||
switch(static_cast<DYNAMIC_TAGS>(dynamic_entries[idx]->tag)) {
|
||||
case DYNAMIC_TAGS::DT_NEEDED:
|
||||
{
|
||||
free(reinterpret_cast<Elf_DynamicEntry_Library_t*>(dynamic_entries[idx]));
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_SONAME:
|
||||
{
|
||||
free(reinterpret_cast<Elf_DynamicEntry_SharedObject_t*>(dynamic_entries[idx]));
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_RPATH:
|
||||
{
|
||||
free(reinterpret_cast<Elf_DynamicEntry_Rpath_t*>(dynamic_entries[idx]));
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_RUNPATH:
|
||||
{
|
||||
free(reinterpret_cast<Elf_DynamicEntry_RunPath_t*>(dynamic_entries[idx]));
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_INIT_ARRAY:
|
||||
case DYNAMIC_TAGS::DT_FINI_ARRAY:
|
||||
case DYNAMIC_TAGS::DT_PREINIT_ARRAY:
|
||||
{
|
||||
free(reinterpret_cast<Elf_DynamicEntry_Array_t*>(dynamic_entries[idx]));
|
||||
break;
|
||||
}
|
||||
|
||||
case DYNAMIC_TAGS::DT_FLAGS:
|
||||
case DYNAMIC_TAGS::DT_FLAGS_1:
|
||||
{
|
||||
free(reinterpret_cast<Elf_DynamicEntry_Flags_t*>(dynamic_entries[idx]));
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
|
||||
free(dynamic_entries[idx]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
free(c_binary->dynamic_entries);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_ELF_DYNAMIC_ENTRY_CPP_C_API_
|
||||
#define LIEF_ELF_DYNAMIC_ENTRY_CPP_C_API_
|
||||
|
||||
#include "LIEF/ELF/Binary.h"
|
||||
#include "LIEF/ELF/Binary.hpp"
|
||||
|
||||
#include "LIEF/ELF/DynamicEntry.h"
|
||||
#include "LIEF/ELF/DynamicEntry.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_dynamic_entries(Elf_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_dynamic_entries(Elf_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,81 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "LIEF/ELF/EnumToString.h"
|
||||
#include "LIEF/ELF/EnumToString.hpp"
|
||||
|
||||
#include "LIEF/ELF/Structures.hpp"
|
||||
#include "LIEF/ELF/structures.h"
|
||||
|
||||
|
||||
extern "C"
|
||||
{
|
||||
const char* E_TYPE_to_string(enum LIEF_ELF_E_TYPE e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::E_TYPE>(e));
|
||||
}
|
||||
|
||||
const char* SYMBOL_BINDINGS_to_string(enum LIEF_ELF_SYMBOL_BINDINGS e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::SYMBOL_BINDINGS>(e));
|
||||
}
|
||||
|
||||
const char* VERSION_to_string(enum LIEF_ELF_VERSION e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::VERSION>(e));
|
||||
}
|
||||
|
||||
const char* ARCH_to_string(enum LIEF_ELF_ARCH e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::ARCH>(e));
|
||||
}
|
||||
|
||||
const char* SEGMENT_TYPES_to_string(enum LIEF_ELF_SEGMENT_TYPES e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::SEGMENT_TYPES>(e));
|
||||
}
|
||||
|
||||
const char* DYNAMIC_TAGS_to_string(enum LIEF_ELF_DYNAMIC_TAGS e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::DYNAMIC_TAGS>(e));
|
||||
}
|
||||
|
||||
const char* ELF_SECTION_TYPES_to_string(enum LIEF_ELF_ELF_SECTION_TYPES e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::ELF_SECTION_TYPES>(e));
|
||||
}
|
||||
|
||||
const char* ELF_SECTION_FLAGS_to_string(enum LIEF_ELF_ELF_SECTION_FLAGS e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::ELF_SECTION_FLAGS>(e));
|
||||
}
|
||||
|
||||
const char* ELF_SYMBOL_TYPES_to_string(enum LIEF_ELF_ELF_SYMBOL_TYPES e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::ELF_SYMBOL_TYPES>(e));
|
||||
}
|
||||
|
||||
const char* ELF_CLASS_to_string(enum LIEF_ELF_ELF_CLASS e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::ELF_CLASS>(e));
|
||||
}
|
||||
|
||||
const char* ELF_DATA_to_string(enum LIEF_ELF_ELF_DATA e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::ELF_DATA>(e));
|
||||
}
|
||||
|
||||
const char* OS_ABI_to_string(enum LIEF_ELF_OS_ABI e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::OS_ABI>(e));
|
||||
}
|
||||
|
||||
const char* DYNAMIC_FLAGS_to_string(enum LIEF_ELF_DYNAMIC_FLAGS e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::DYNAMIC_FLAGS>(e));
|
||||
}
|
||||
|
||||
const char* DYNAMIC_FLAGS_1_to_string(enum LIEF_ELF_DYNAMIC_FLAGS_1 e) {
|
||||
return LIEF::ELF::to_string(static_cast<LIEF::ELF::DYNAMIC_FLAGS_1>(e));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Header.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_header(Elf_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
const Header& hdr = binary->header();
|
||||
c_binary->header.file_type = static_cast<enum LIEF_ELF_E_TYPE>(hdr.file_type());
|
||||
c_binary->header.machine_type = static_cast<enum LIEF_ELF_ARCH>(hdr.machine_type());
|
||||
c_binary->header.object_file_version = static_cast<enum LIEF_ELF_VERSION>(hdr.object_file_version());
|
||||
c_binary->header.program_headers_offset = hdr.program_headers_offset();
|
||||
c_binary->header.section_headers_offset = hdr.section_headers_offset();
|
||||
c_binary->header.processor_flags = hdr.processor_flag();
|
||||
c_binary->header.header_size = hdr.header_size();
|
||||
c_binary->header.program_header_size = hdr.program_header_size();
|
||||
c_binary->header.numberof_segments = hdr.numberof_segments();
|
||||
c_binary->header.section_header_size = hdr.section_header_size();
|
||||
c_binary->header.numberof_sections = hdr.numberof_sections();
|
||||
c_binary->header.name_string_table_idx = hdr.section_name_table_idx();
|
||||
c_binary->header.entrypoint = hdr.entrypoint();
|
||||
const Header::identity_t& ident = hdr.identity();
|
||||
std::copy(
|
||||
std::begin(ident),
|
||||
std::end(ident),
|
||||
c_binary->header.identity);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_ELF_HEADER_CPP_C_API_
|
||||
#define LIEF_ELF_HEADER_CPP_C_API_
|
||||
|
||||
#include "LIEF/ELF/Binary.h"
|
||||
#include "LIEF/ELF/Binary.hpp"
|
||||
|
||||
#include "LIEF/ELF/Header.h"
|
||||
#include "LIEF/ELF/Header.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_header(Elf_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,71 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Section.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
void init_c_sections(Elf_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
it_sections sections = binary->sections();
|
||||
|
||||
c_binary->sections = static_cast<Elf_Section_t**>(
|
||||
malloc((sections.size() + 1) * sizeof(Elf_Section_t**)));
|
||||
|
||||
for (size_t i = 0; i < sections.size(); ++i) {
|
||||
Section& b_section = sections[i];
|
||||
c_binary->sections[i] = static_cast<Elf_Section_t*>(malloc(sizeof(Elf_Section_t)));
|
||||
const std::vector<uint8_t>& section_content = b_section.content();
|
||||
uint8_t* content = static_cast<uint8_t*>(malloc(section_content.size() * sizeof(uint8_t)));
|
||||
std::copy(
|
||||
std::begin(section_content),
|
||||
std::end(section_content),
|
||||
content);
|
||||
|
||||
c_binary->sections[i]->name = b_section.name().c_str();
|
||||
c_binary->sections[i]->flags = b_section.flags();
|
||||
c_binary->sections[i]->type = static_cast<enum LIEF_ELF_ELF_SECTION_TYPES>(b_section.type());
|
||||
c_binary->sections[i]->virtual_address = b_section.virtual_address();
|
||||
c_binary->sections[i]->offset = b_section.file_offset();
|
||||
c_binary->sections[i]->original_size = b_section.original_size();
|
||||
c_binary->sections[i]->link = b_section.link();
|
||||
c_binary->sections[i]->info = b_section.information();
|
||||
c_binary->sections[i]->alignment = b_section.alignment();
|
||||
c_binary->sections[i]->entry_size = b_section.entry_size();
|
||||
c_binary->sections[i]->content = content;
|
||||
c_binary->sections[i]->size = section_content.size();
|
||||
c_binary->sections[i]->entropy = b_section.entropy();
|
||||
}
|
||||
c_binary->sections[sections.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_sections(Elf_Binary_t* c_binary) {
|
||||
|
||||
Elf_Section_t **sections = c_binary->sections;
|
||||
for (size_t idx = 0; sections[idx] != nullptr; ++idx) {
|
||||
free(sections[idx]->content);
|
||||
free(sections[idx]);
|
||||
}
|
||||
free(c_binary->sections);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_ELF_SECTION_CPP_C_API_
|
||||
#define LIEF_ELF_SECTION_CPP_C_API_
|
||||
|
||||
#include "LIEF/ELF/Binary.h"
|
||||
#include "LIEF/ELF/Binary.hpp"
|
||||
|
||||
#include "LIEF/ELF/Section.h"
|
||||
#include "LIEF/ELF/Section.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_sections(Elf_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_sections(Elf_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,67 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Segment.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_segments(Elf_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
it_segments segments = binary->segments();
|
||||
c_binary->segments = static_cast<Elf_Segment_t**>(
|
||||
malloc((segments.size() + 1) * sizeof(Elf_Segment_t**)));
|
||||
for (size_t i = 0; i < segments.size(); ++i) {
|
||||
Segment& segment = segments[i];
|
||||
|
||||
const std::vector<uint8_t>& segment_content = segment.content();
|
||||
uint8_t* content = static_cast<uint8_t*>(malloc(segment_content.size() * sizeof(uint8_t)));
|
||||
std::copy(
|
||||
std::begin(segment_content),
|
||||
std::end(segment_content),
|
||||
content);
|
||||
|
||||
c_binary->segments[i] = static_cast<Elf_Segment_t*>(malloc(sizeof(Elf_Segment_t)));
|
||||
c_binary->segments[i]->type = static_cast<enum LIEF_ELF_SEGMENT_TYPES>(segment.type());
|
||||
c_binary->segments[i]->flags = static_cast<uint32_t>(segment.flags());
|
||||
c_binary->segments[i]->virtual_address = segment.virtual_address();
|
||||
c_binary->segments[i]->virtual_size = segment.virtual_size();
|
||||
c_binary->segments[i]->offset = segment.file_offset();
|
||||
c_binary->segments[i]->alignment = segment.alignment();
|
||||
c_binary->segments[i]->size = segment_content.size();
|
||||
c_binary->segments[i]->content = content;
|
||||
}
|
||||
|
||||
c_binary->segments[segments.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_segments(Elf_Binary_t* c_binary) {
|
||||
|
||||
Elf_Segment_t **segments = c_binary->segments;
|
||||
for (size_t idx = 0; segments[idx] != nullptr; ++idx) {
|
||||
free(segments[idx]->content);
|
||||
free(segments[idx]);
|
||||
}
|
||||
free(c_binary->segments);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_ELF_SEGMENT_CPP_C_API_
|
||||
#define LIEF_ELF_SEGMENT_CPP_C_API_
|
||||
|
||||
#include "LIEF/ELF/Binary.h"
|
||||
#include "LIEF/ELF/Binary.hpp"
|
||||
|
||||
#include "LIEF/ELF/Segment.h"
|
||||
#include "LIEF/ELF/Segment.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_segments(Elf_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_segments(Elf_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,94 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Symbol.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_dynamic_symbols(Elf_Binary_t* c_binary, Binary* binary) {
|
||||
it_symbols dyn_symb = binary->dynamic_symbols();
|
||||
|
||||
c_binary->dynamic_symbols = static_cast<Elf_Symbol_t**>(
|
||||
malloc((dyn_symb.size() + 1) * sizeof(Elf_Symbol_t**)));
|
||||
|
||||
for (size_t i = 0; i < dyn_symb.size(); ++i) {
|
||||
Symbol& b_sym = dyn_symb[i];
|
||||
c_binary->dynamic_symbols[i] = static_cast<Elf_Symbol_t*>(malloc(sizeof(Elf_Symbol_t)));
|
||||
c_binary->dynamic_symbols[i]->name = b_sym.name().c_str();
|
||||
c_binary->dynamic_symbols[i]->type = static_cast<enum LIEF_ELF_ELF_SYMBOL_TYPES>(b_sym.type());
|
||||
c_binary->dynamic_symbols[i]->binding = static_cast<enum LIEF_ELF_SYMBOL_BINDINGS>(b_sym.binding());
|
||||
c_binary->dynamic_symbols[i]->other = b_sym.other();
|
||||
c_binary->dynamic_symbols[i]->shndx = b_sym.shndx();
|
||||
c_binary->dynamic_symbols[i]->value = b_sym.value();
|
||||
c_binary->dynamic_symbols[i]->size = b_sym.size();
|
||||
c_binary->dynamic_symbols[i]->information = b_sym.information();
|
||||
c_binary->dynamic_symbols[i]->is_exported = b_sym.is_exported();
|
||||
c_binary->dynamic_symbols[i]->is_imported = b_sym.is_imported();
|
||||
}
|
||||
c_binary->dynamic_symbols[dyn_symb.size()] = nullptr;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void init_c_static_symbols(Elf_Binary_t* c_binary, Binary* binary) {
|
||||
it_symbols static_symb = binary->static_symbols();
|
||||
|
||||
c_binary->static_symbols = static_cast<Elf_Symbol_t**>(
|
||||
malloc((static_symb.size() + 1) * sizeof(Elf_Symbol_t**)));
|
||||
|
||||
for (size_t i = 0; i < static_symb.size(); ++i) {
|
||||
Symbol& b_sym = static_symb[i];
|
||||
c_binary->static_symbols[i] = static_cast<Elf_Symbol_t*>(malloc(sizeof(Elf_Symbol_t)));
|
||||
c_binary->static_symbols[i]->name = b_sym.name().c_str();
|
||||
c_binary->static_symbols[i]->type = static_cast<enum LIEF_ELF_ELF_SYMBOL_TYPES>(b_sym.type());
|
||||
c_binary->static_symbols[i]->binding = static_cast<enum LIEF_ELF_SYMBOL_BINDINGS>(b_sym.binding());
|
||||
c_binary->static_symbols[i]->other = b_sym.other();
|
||||
c_binary->static_symbols[i]->shndx = b_sym.shndx();
|
||||
c_binary->static_symbols[i]->value = b_sym.value();
|
||||
c_binary->static_symbols[i]->size = b_sym.size();
|
||||
c_binary->static_symbols[i]->information = b_sym.information();
|
||||
c_binary->static_symbols[i]->is_exported = b_sym.is_exported();
|
||||
c_binary->static_symbols[i]->is_imported = b_sym.is_imported();
|
||||
}
|
||||
c_binary->static_symbols[static_symb.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_dynamic_symbols(Elf_Binary_t* c_binary) {
|
||||
Elf_Symbol_t **dynamic_symbols = c_binary->dynamic_symbols;
|
||||
for (size_t idx = 0; dynamic_symbols[idx] != nullptr; ++idx) {
|
||||
free(dynamic_symbols[idx]);
|
||||
}
|
||||
free(c_binary->dynamic_symbols);
|
||||
}
|
||||
|
||||
|
||||
void destroy_static_symbols(Elf_Binary_t* c_binary) {
|
||||
Elf_Symbol_t **static_symbols = c_binary->static_symbols;
|
||||
for (size_t idx = 0; static_symbols[idx] != nullptr; ++idx) {
|
||||
free(static_symbols[idx]);
|
||||
}
|
||||
free(c_binary->static_symbols);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_ELF_SYMBOL_CPP_C_API_
|
||||
#define LIEF_ELF_SYMBOL_CPP_C_API_
|
||||
|
||||
#include "LIEF/ELF/Binary.h"
|
||||
#include "LIEF/ELF/Binary.hpp"
|
||||
|
||||
#include "LIEF/ELF/Symbol.h"
|
||||
#include "LIEF/ELF/Symbol.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace ELF {
|
||||
|
||||
void init_c_dynamic_symbols(Elf_Binary_t* c_binary, Binary* binary);
|
||||
void init_c_static_symbols(Elf_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
void destroy_dynamic_symbols(Elf_Binary_t* c_binary);
|
||||
void destroy_static_symbols(Elf_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,22 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "LIEF/ELF/utils.hpp"
|
||||
#include "LIEF/ELF/utils.h"
|
||||
|
||||
bool is_elf(const char* file) {
|
||||
return LIEF::ELF::is_elf(file);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "LIEF/MachO/Binary.h"
|
||||
|
||||
#include "LIEF/MachO/Binary.hpp"
|
||||
|
||||
#include "Binary.hpp"
|
||||
#include "Section.hpp"
|
||||
#include "Header.hpp"
|
||||
#include "Symbol.hpp"
|
||||
#include "Segment.hpp"
|
||||
#include "LoadCommand.hpp"
|
||||
|
||||
|
||||
using namespace LIEF::MachO;
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
void init_c_binary(Macho_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
c_binary->handler = reinterpret_cast<void*>(binary);
|
||||
c_binary->name = binary->name().c_str();
|
||||
c_binary->imagebase = binary->imagebase();
|
||||
init_c_header(c_binary, binary);
|
||||
init_c_commands(c_binary, binary);
|
||||
init_c_symbols(c_binary, binary);
|
||||
init_c_sections(c_binary, binary);
|
||||
init_c_segments(c_binary, binary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void macho_binaries_destroy(Macho_Binary_t** binaries) {
|
||||
for (size_t i = 0; binaries[i] != nullptr; ++i) {
|
||||
destroy_sections(binaries[i]);
|
||||
destroy_commands(binaries[i]);
|
||||
destroy_symbols(binaries[i]);
|
||||
destroy_segments(binaries[i]);
|
||||
|
||||
delete reinterpret_cast<Binary*>(binaries[i]->handler);
|
||||
free(binaries[i]);
|
||||
}
|
||||
free(binaries);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_MACHO_BINARY_CPP_C_API_
|
||||
#define LIEF_MACHO_BINARY_CPP_C_API_
|
||||
|
||||
#include "LIEF/MachO/Binary.h"
|
||||
#include "LIEF/MachO/Binary.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
|
||||
void init_c_binary(Macho_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,46 @@
|
||||
include_directories(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include"
|
||||
)
|
||||
|
||||
set(LIEF_API_C_MACHO_SRC
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EnumToString.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Parser.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/LoadCommand.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Segment.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Symbol.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Section.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Header.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Binary.cpp"
|
||||
)
|
||||
|
||||
|
||||
set(LIEF_API_C_MACHO_INCLUDE_FILES_CPP
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Header.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Binary.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/LoadCommand.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Section.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Segment.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Symbol.hpp"
|
||||
)
|
||||
|
||||
|
||||
set(LIEF_API_C_MACHO_INCLUDE_FILES_C
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/MachO/structures.h"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/MachO/enums.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/Binary.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/EnumToString.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/Header.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/LoadCommand.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/Section.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/Segment.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/Symbol.h"
|
||||
)
|
||||
|
||||
|
||||
set(LIEF_C_MACHO_INC "${LIEF_API_C_MACHO_INCLUDE_FILES_C}" "${LIEF_API_C_MACHO_INCLUDE_FILES_CPP}")
|
||||
|
||||
source_group("Source Files\\C API\\MachO" FILES ${LIEF_API_C_MACHO_SRC})
|
||||
source_group("Header Files\\C API\\MachO" FILES ${LIEF_C_MACHO_INC})
|
||||
|
||||
target_sources(LIB_LIEF PRIVATE "${LIEF_API_C_MACHO_SRC}" ${LIEF_C_MACHO_INC})
|
||||
@@ -0,0 +1,76 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "LIEF/MachO/EnumToString.h"
|
||||
#include "LIEF/MachO/EnumToString.hpp"
|
||||
|
||||
#include "LIEF/MachO/enums.hpp"
|
||||
#include "LIEF/MachO/enums.h"
|
||||
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
const char* LOAD_COMMAND_TYPES_to_string(enum LIEF_MACHO_LOAD_COMMAND_TYPES e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::LOAD_COMMAND_TYPES>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* MACHO_TYPES_to_string(enum LIEF_MACHO_MACHO_TYPES e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::MACHO_TYPES>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* FILE_TYPES_to_string(enum LIEF_MACHO_FILE_TYPES e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::FILE_TYPES>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* CPU_TYPES_to_string(enum LIEF_MACHO_CPU_TYPES e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::CPU_TYPES>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* HEADER_FLAGS_to_string(enum LIEF_MACHO_HEADER_FLAGS e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::HEADER_FLAGS>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* MACHO_SECTION_TYPES_to_string(enum LIEF_MACHO_MACHO_SECTION_TYPES e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::MACHO_SECTION_TYPES>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* MACHO_SYMBOL_TYPES_to_string(enum LIEF_MACHO_MACHO_SYMBOL_TYPES e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::MACHO_SYMBOL_TYPES>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* N_LIST_TYPES_to_string(enum LIEF_MACHO_N_LIST_TYPES e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::N_LIST_TYPES>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* SYMBOL_DESCRIPTIONS_to_string(enum LIEF_MACHO_SYMBOL_DESCRIPTIONS e) {
|
||||
return LIEF::MachO::to_string(static_cast<LIEF::MachO::SYMBOL_DESCRIPTIONS>(e));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Header.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
void init_c_header(Macho_Binary_t* c_binary, Binary* binary) {
|
||||
Header& header = binary->header();
|
||||
c_binary->header.magic = static_cast<uint32_t>(header.magic());
|
||||
c_binary->header.cpu_type = static_cast<enum LIEF_MACHO_CPU_TYPES>(header.cpu_type());
|
||||
c_binary->header.cpu_subtype = header.cpu_subtype();
|
||||
c_binary->header.file_type = static_cast<enum LIEF_MACHO_FILE_TYPES>(header.file_type());
|
||||
c_binary->header.nb_cmds = header.nb_cmds();
|
||||
c_binary->header.sizeof_cmds = header.sizeof_cmds();
|
||||
c_binary->header.flags = header.flags();
|
||||
c_binary->header.reserved = header.reserved();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_MACHO_HEADER_CPP_C_API_
|
||||
#define LIEF_MACHO_HEADER_CPP_C_API_
|
||||
|
||||
#include "LIEF/MachO/Binary.h"
|
||||
#include "LIEF/MachO/Binary.hpp"
|
||||
|
||||
#include "LIEF/MachO/Header.h"
|
||||
#include "LIEF/MachO/Header.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
|
||||
void init_c_header(Macho_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,62 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "LoadCommand.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
void init_c_commands(Macho_Binary_t* c_binary, Binary* binary) {
|
||||
it_commands commands = binary->commands();
|
||||
|
||||
c_binary->commands = static_cast<Macho_Command_t**>(
|
||||
malloc((commands.size() + 1) * sizeof(Macho_Command_t**)));
|
||||
|
||||
for (size_t i = 0; i < commands.size(); ++i) {
|
||||
LoadCommand& cmd = commands[i];
|
||||
|
||||
c_binary->commands[i] = static_cast<Macho_Command_t*>(malloc(sizeof(Macho_Command_t)));
|
||||
const std::vector<uint8_t>& cmd_content = cmd.data();
|
||||
uint8_t* content = static_cast<uint8_t*>(malloc(cmd_content.size() * sizeof(uint8_t)));
|
||||
std::copy(
|
||||
std::begin(cmd_content),
|
||||
std::end(cmd_content),
|
||||
content);
|
||||
|
||||
c_binary->commands[i]->command = static_cast<enum LIEF_MACHO_LOAD_COMMAND_TYPES>(cmd.command());
|
||||
c_binary->commands[i]->size = cmd.size();
|
||||
c_binary->commands[i]->data = content;
|
||||
c_binary->commands[i]->offset = cmd.command_offset();
|
||||
}
|
||||
|
||||
c_binary->commands[commands.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_commands(Macho_Binary_t* c_binary) {
|
||||
Macho_Command_t **commands = c_binary->commands;
|
||||
for (size_t idx = 0; commands[idx] != nullptr; ++idx) {
|
||||
free(commands[idx]->data);
|
||||
free(commands[idx]);
|
||||
}
|
||||
free(c_binary->commands);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_MACHO_LOAD_COMMAND_CPP_C_API_
|
||||
#define LIEF_MACHO_LOAD_COMMAND_CPP_C_API_
|
||||
|
||||
#include "LIEF/MachO/Binary.h"
|
||||
#include "LIEF/MachO/Binary.hpp"
|
||||
|
||||
#include "LIEF/MachO/LoadCommand.h"
|
||||
#include "LIEF/MachO/LoadCommand.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
|
||||
void init_c_commands(Macho_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_commands(Macho_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <cstring>
|
||||
|
||||
#include "LIEF/MachO/Binary.h"
|
||||
#include "LIEF/MachO/Parser.hpp"
|
||||
#include "LIEF/MachO/FatBinary.hpp"
|
||||
|
||||
#include "Binary.hpp"
|
||||
|
||||
using namespace LIEF::MachO;
|
||||
|
||||
Macho_Binary_t** macho_parse(const char *file) {
|
||||
FatBinary* macho_binaries = Parser::parse(file).release();
|
||||
|
||||
Macho_Binary_t** c_macho_binaries = static_cast<Macho_Binary_t**>(
|
||||
malloc((macho_binaries->size() + 1) * sizeof(Macho_Binary_t**)));
|
||||
|
||||
for (size_t i = 0; i < macho_binaries->size(); ++i) {
|
||||
Binary& binary = (*macho_binaries)[i];
|
||||
c_macho_binaries[i] = static_cast<Macho_Binary_t*>(malloc(sizeof(Macho_Binary_t)));
|
||||
init_c_binary(c_macho_binaries[i], &binary);
|
||||
}
|
||||
|
||||
c_macho_binaries[macho_binaries->size()] = nullptr;
|
||||
|
||||
return c_macho_binaries;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Section.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
void init_c_sections(Macho_Binary_t* c_binary, Binary* binary) {
|
||||
it_sections sections = binary->sections();
|
||||
|
||||
c_binary->sections = static_cast<Macho_Section_t**>(
|
||||
malloc((sections.size() + 1) * sizeof(Macho_Section_t**)));
|
||||
|
||||
for (size_t i = 0; i < sections.size(); ++i) {
|
||||
Section& section = sections[i];
|
||||
|
||||
c_binary->sections[i] = static_cast<Macho_Section_t*>(malloc(sizeof(Macho_Section_t)));
|
||||
const std::vector<uint8_t>& section_content = section.content();
|
||||
uint8_t* content = static_cast<uint8_t*>(malloc(section_content.size() * sizeof(uint8_t)));
|
||||
std::copy(
|
||||
std::begin(section_content),
|
||||
std::end(section_content),
|
||||
content);
|
||||
|
||||
c_binary->sections[i]->name = section.name().c_str();
|
||||
c_binary->sections[i]->alignment = section.alignment();
|
||||
c_binary->sections[i]->relocation_offset = section.relocation_offset();
|
||||
c_binary->sections[i]->numberof_relocations = section.numberof_relocations();
|
||||
c_binary->sections[i]->flags = section.flags();
|
||||
c_binary->sections[i]->type = static_cast<enum LIEF_MACHO_MACHO_SECTION_TYPES>(section.type());
|
||||
c_binary->sections[i]->reserved1 = section.reserved1();
|
||||
c_binary->sections[i]->reserved2 = section.reserved2();
|
||||
c_binary->sections[i]->reserved3 = section.reserved3();
|
||||
c_binary->sections[i]->virtual_address = section.virtual_address();
|
||||
c_binary->sections[i]->offset = section.offset();
|
||||
c_binary->sections[i]->size = section.size();
|
||||
c_binary->sections[i]->content = content;
|
||||
c_binary->sections[i]->entropy = section.entropy();
|
||||
}
|
||||
|
||||
c_binary->sections[sections.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_sections(Macho_Binary_t* c_binary) {
|
||||
Macho_Section_t **sections = c_binary->sections;
|
||||
for (size_t idx = 0; sections[idx] != nullptr; ++idx) {
|
||||
free(sections[idx]->content);
|
||||
free(sections[idx]);
|
||||
}
|
||||
free(c_binary->sections);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_MACHO_SECTION_CPP_C_API_
|
||||
#define LIEF_MACHO_SECTION_CPP_C_API_
|
||||
|
||||
#include "LIEF/MachO/Binary.h"
|
||||
#include "LIEF/MachO/Binary.hpp"
|
||||
|
||||
#include "LIEF/MachO/Section.h"
|
||||
#include "LIEF/MachO/Section.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
|
||||
void init_c_sections(Macho_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_sections(Macho_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,70 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Segment.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
void init_c_segments(Macho_Binary_t* c_binary, Binary* binary) {
|
||||
it_segments segments = binary->segments();
|
||||
|
||||
c_binary->segments = static_cast<Macho_Segment_t**>(
|
||||
malloc((segments.size() + 1) * sizeof(Macho_Segment_t**)));
|
||||
|
||||
for (size_t i = 0; i < segments.size(); ++i) {
|
||||
SegmentCommand& segment = segments[i];
|
||||
|
||||
c_binary->segments[i] = static_cast<Macho_Segment_t*>(malloc(sizeof(Macho_Segment_t)));
|
||||
const std::vector<uint8_t>& segment_content = segment.content();
|
||||
uint8_t* content = static_cast<uint8_t*>(malloc(segment_content.size() * sizeof(uint8_t)));
|
||||
std::copy(
|
||||
std::begin(segment_content),
|
||||
std::end(segment_content),
|
||||
content);
|
||||
|
||||
c_binary->segments[i]->name = segment.name().c_str();
|
||||
c_binary->segments[i]->virtual_address = segment.virtual_address();
|
||||
c_binary->segments[i]->virtual_size = segment.virtual_size();
|
||||
c_binary->segments[i]->file_size = segment.file_size();
|
||||
c_binary->segments[i]->file_offset = segment.file_offset();
|
||||
c_binary->segments[i]->max_protection = segment.max_protection();
|
||||
c_binary->segments[i]->init_protection = segment.init_protection();
|
||||
c_binary->segments[i]->numberof_sections = segment.numberof_sections();
|
||||
c_binary->segments[i]->flags = segment.flags();
|
||||
c_binary->segments[i]->content = content;
|
||||
c_binary->segments[i]->size = segment_content.size();
|
||||
c_binary->segments[i]->sections = nullptr; //TODO
|
||||
}
|
||||
|
||||
c_binary->segments[segments.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_segments(Macho_Binary_t* c_binary) {
|
||||
Macho_Segment_t **segments = c_binary->segments;
|
||||
for (size_t idx = 0; segments[idx] != nullptr; ++idx) {
|
||||
free(segments[idx]->content);
|
||||
free(segments[idx]);
|
||||
}
|
||||
free(c_binary->segments);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_MACHO_SEGMENT_CPP_C_API_
|
||||
#define LIEF_MACHO_SEGMENT_CPP_C_API_
|
||||
|
||||
#include "LIEF/MachO/Binary.h"
|
||||
#include "LIEF/MachO/Binary.hpp"
|
||||
|
||||
#include "LIEF/MachO/Segment.h"
|
||||
#include "LIEF/MachO/SegmentCommand.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
|
||||
void init_c_segments(Macho_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_segments(Macho_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,56 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Symbol.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
void init_c_symbols(Macho_Binary_t* c_binary, Binary* binary) {
|
||||
it_symbols symbols = binary->symbols();
|
||||
|
||||
c_binary->symbols = static_cast<Macho_Symbol_t**>(
|
||||
malloc((symbols.size() + 1) * sizeof(Macho_Symbol_t**)));
|
||||
|
||||
for (size_t i = 0; i < symbols.size(); ++i) {
|
||||
Symbol& symbol = symbols[i];
|
||||
|
||||
c_binary->symbols[i] = static_cast<Macho_Symbol_t*>(malloc(sizeof(Macho_Symbol_t)));
|
||||
|
||||
c_binary->symbols[i]->name = symbol.name().c_str();
|
||||
c_binary->symbols[i]->type = symbol.type();
|
||||
c_binary->symbols[i]->numberof_sections = symbol.numberof_sections();
|
||||
c_binary->symbols[i]->description = symbol.description();
|
||||
c_binary->symbols[i]->value = symbol.value();
|
||||
}
|
||||
|
||||
c_binary->symbols[symbols.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_symbols(Macho_Binary_t* c_binary) {
|
||||
Macho_Symbol_t **symbols = c_binary->symbols;
|
||||
for (size_t idx = 0; symbols[idx] != nullptr; ++idx) {
|
||||
free(symbols[idx]);
|
||||
}
|
||||
free(c_binary->symbols);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_MACHO_SYMBOL_CPP_C_API_
|
||||
#define LIEF_MACHO_SYMBOL_CPP_C_API_
|
||||
|
||||
#include "LIEF/MachO/Binary.h"
|
||||
#include "LIEF/MachO/Binary.hpp"
|
||||
|
||||
#include "LIEF/MachO/Symbol.h"
|
||||
#include "LIEF/MachO/Symbol.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace MachO {
|
||||
|
||||
void init_c_symbols(Macho_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_symbols(Macho_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,67 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <cstring>
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
|
||||
#include "LIEF/PE/Parser.hpp"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
#include "Binary.hpp"
|
||||
#include "DosHeader.hpp"
|
||||
#include "Header.hpp"
|
||||
#include "OptionalHeader.hpp"
|
||||
#include "Section.hpp"
|
||||
#include "DataDirectory.hpp"
|
||||
#include "Import.hpp"
|
||||
|
||||
using namespace LIEF::PE;
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_binary(Pe_Binary_t* c_binary, Binary* binary) {
|
||||
c_binary->name = binary->name().c_str();
|
||||
c_binary->handler = reinterpret_cast<void*>(binary);
|
||||
|
||||
init_c_dos_header(c_binary, binary);
|
||||
init_c_header(c_binary, binary);
|
||||
init_c_optional_header(c_binary, binary);
|
||||
init_c_sections(c_binary, binary);
|
||||
init_c_data_directories(c_binary, binary);
|
||||
init_c_imports(c_binary, binary);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Pe_Binary_t* pe_parse(const char *file) {
|
||||
Binary* binary = Parser::parse(file).release();
|
||||
Pe_Binary_t* c_binary = static_cast<Pe_Binary_t*>(malloc(sizeof(Pe_Binary_t)));
|
||||
std::memset(c_binary, 0, sizeof(Pe_Binary_t));
|
||||
init_c_binary(c_binary, binary);
|
||||
|
||||
return c_binary;
|
||||
}
|
||||
|
||||
void pe_binary_destroy(Pe_Binary_t* binary) {
|
||||
destroy_sections(binary);
|
||||
destroy_data_directories(binary);
|
||||
destroy_imports(binary);
|
||||
delete reinterpret_cast<Binary*>(binary->handler);
|
||||
free(binary);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_PE_BINARY_CPP_C_API_
|
||||
#define LIEF_PE_BINARY_CPP_C_API_
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_binary(Pe_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,49 @@
|
||||
include_directories(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/include"
|
||||
)
|
||||
set(LIEF_API_C_PE_SRC
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Binary.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/DosHeader.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Header.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/OptionalHeader.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Section.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/DataDirectory.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/EnumToString.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Import.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/ImportEntry.cpp"
|
||||
)
|
||||
|
||||
|
||||
set(LIEF_API_C_PE_INCLUDE_FILES_CPP
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Binary.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/DataDirectory.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/DosHeader.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Header.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/OptionalHeader.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Section.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Import.hpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/ImportEntry.hpp"
|
||||
)
|
||||
|
||||
set(LIEF_API_C_PE_INCLUDE_FILES_C
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/PE/structures.h"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/PE/enums.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/Binary.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/DataDirectory.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/DosHeader.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/EnumToString.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/Header.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/OptionalHeader.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/Section.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/Import.h"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/ImportEntry.h"
|
||||
)
|
||||
|
||||
|
||||
set(LIEF_C_PE_INC "${LIEF_API_C_PE_INCLUDE_FILES_C}" "${LIEF_API_C_PE_INCLUDE_FILES_CPP}")
|
||||
|
||||
source_group("Source Files\\C API\\PE" FILES ${LIEF_API_C_PE_SRC})
|
||||
source_group("Header Files\\C API\\PE" FILES ${LIEF_C_PE_INC})
|
||||
|
||||
target_sources(LIB_LIEF PRIVATE "${LIEF_API_C_PE_SRC}" "${LIEF_C_PE_INC}")
|
||||
@@ -0,0 +1,54 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "DataDirectory.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
void init_c_data_directories(Pe_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
it_data_directories data_directories = binary->data_directories();
|
||||
|
||||
c_binary->data_directories = static_cast<Pe_DataDirectory_t**>(
|
||||
malloc((data_directories.size() + 1) * sizeof(Pe_DataDirectory_t**)));
|
||||
|
||||
for (size_t i = 0; i < data_directories.size(); ++i) {
|
||||
|
||||
c_binary->data_directories[i] = static_cast<Pe_DataDirectory_t*>(malloc(sizeof(Pe_DataDirectory_t)));
|
||||
c_binary->data_directories[i]->rva = data_directories[i].RVA();
|
||||
c_binary->data_directories[i]->size = data_directories[i].size();
|
||||
}
|
||||
c_binary->data_directories[data_directories.size()] = nullptr;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_data_directories(Pe_Binary_t* c_binary) {
|
||||
|
||||
Pe_DataDirectory_t **data_directories = c_binary->data_directories;
|
||||
for (size_t idx = 0; data_directories[idx] != nullptr; ++idx) {
|
||||
free(data_directories[idx]);
|
||||
}
|
||||
free(c_binary->data_directories);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_PE_DATA_DIRECTORY_CPP_C_API_
|
||||
#define LIEF_PE_DATA_DIRECTORY_CPP_C_API_
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
#include "LIEF/PE/DataDirectory.h"
|
||||
#include "LIEF/PE/DataDirectory.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_data_directories(Pe_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_data_directories(Pe_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,55 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "DosHeader.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
void init_c_dos_header(Pe_Binary_t* c_binary, Binary* binary) {
|
||||
const DosHeader& dos_header = binary->dos_header();
|
||||
c_binary->dos_header.magic = dos_header.magic();
|
||||
c_binary->dos_header.used_bytes_in_the_last_page = dos_header.used_bytes_in_the_last_page();
|
||||
c_binary->dos_header.file_size_in_pages = dos_header.file_size_in_pages();
|
||||
c_binary->dos_header.numberof_relocation = dos_header.numberof_relocation();
|
||||
c_binary->dos_header.header_size_in_paragraphs = dos_header.header_size_in_paragraphs();
|
||||
c_binary->dos_header.minimum_extra_paragraphs = dos_header.minimum_extra_paragraphs();
|
||||
c_binary->dos_header.maximum_extra_paragraphs = dos_header.maximum_extra_paragraphs();
|
||||
c_binary->dos_header.initial_relative_ss = dos_header.initial_relative_ss();
|
||||
c_binary->dos_header.initial_sp = dos_header.initial_sp();
|
||||
c_binary->dos_header.checksum = dos_header.checksum();
|
||||
c_binary->dos_header.initial_ip = dos_header.initial_ip();
|
||||
c_binary->dos_header.initial_relative_cs = dos_header.initial_relative_cs();
|
||||
c_binary->dos_header.addressof_relocation_table = dos_header.addressof_relocation_table();
|
||||
c_binary->dos_header.overlay_number = dos_header.overlay_number();
|
||||
c_binary->dos_header.oem_id = dos_header.oem_id();
|
||||
c_binary->dos_header.oem_info = dos_header.oem_info();
|
||||
c_binary->dos_header.addressof_new_exeheader = dos_header.addressof_new_exeheader();
|
||||
|
||||
const DosHeader::reserved_t& reserved = dos_header.reserved();
|
||||
std::copy(
|
||||
std::begin(reserved),
|
||||
std::end(reserved),
|
||||
c_binary->dos_header.reserved);
|
||||
|
||||
|
||||
const DosHeader::reserved2_t& reserved2 = dos_header.reserved2();
|
||||
std::copy(
|
||||
std::begin(reserved2),
|
||||
std::end(reserved2),
|
||||
c_binary->dos_header.reserved2);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_PE_DOS_HEADER_CPP_C_API_
|
||||
#define LIEF_PE_DOS_HEADER_CPP_C_API_
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
#include "LIEF/PE/DosHeader.h"
|
||||
#include "LIEF/PE/DosHeader.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_dos_header(Pe_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,40 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "LIEF/PE/EnumToString.h"
|
||||
#include "LIEF/PE/EnumToString.hpp"
|
||||
|
||||
#include "LIEF/PE/enums.hpp"
|
||||
#include "LIEF/PE/enums.h"
|
||||
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
const char* PE_TYPES_to_string(enum LIEF_PE_PE_TYPES e) {
|
||||
return LIEF::PE::to_string(static_cast<LIEF::PE::PE_TYPE>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* MACHINE_TYPES_to_string(enum LIEF_PE_MACHINE_TYPES e) {
|
||||
return LIEF::PE::to_string(static_cast<LIEF::PE::MACHINE_TYPES>(e));
|
||||
}
|
||||
|
||||
|
||||
const char* SUBSYSTEM_to_string(enum LIEF_PE_SUBSYSTEM e) {
|
||||
return LIEF::PE::to_string(static_cast<LIEF::PE::SUBSYSTEM>(e));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Header.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_header(Pe_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
const Header& header = binary->header();
|
||||
|
||||
const Header::signature_t& signature = header.signature();
|
||||
|
||||
c_binary->header.machine = static_cast<enum LIEF_PE_MACHINE_TYPES>(header.machine());
|
||||
c_binary->header.numberof_sections = header.numberof_sections();
|
||||
c_binary->header.time_date_stamp = header.time_date_stamp();
|
||||
c_binary->header.pointerto_symbol_table = header.pointerto_symbol_table();
|
||||
c_binary->header.numberof_symbols = header.numberof_symbols();
|
||||
c_binary->header.sizeof_optional_header = header.sizeof_optional_header();
|
||||
c_binary->header.characteristics = static_cast<uint16_t>(header.characteristics());
|
||||
|
||||
std::copy(
|
||||
std::begin(signature),
|
||||
std::end(signature),
|
||||
c_binary->header.signature);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_PE_HEADER_CPP_C_API_
|
||||
#define LIEF_PE_HEADER_CPP_C_API_
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
#include "LIEF/PE/Header.h"
|
||||
#include "LIEF/PE/Header.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_header(Pe_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,65 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Import.hpp"
|
||||
#include "ImportEntry.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_imports(Pe_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
if (not binary->has_imports()) {
|
||||
c_binary->imports = nullptr;
|
||||
}
|
||||
|
||||
it_imports imports = binary->imports();
|
||||
|
||||
c_binary->imports = static_cast<Pe_Import_t**>(
|
||||
malloc((imports.size() + 1) * sizeof(Pe_Import_t**)));
|
||||
|
||||
for (size_t i = 0; i < imports.size(); ++i) {
|
||||
Import& imp = imports[i];
|
||||
c_binary->imports[i] = static_cast<Pe_Import_t*>(malloc(sizeof(Pe_Import_t)));
|
||||
|
||||
c_binary->imports[i]->name = imp.name().c_str();
|
||||
c_binary->imports[i]->forwarder_chain = imp.forwarder_chain();
|
||||
c_binary->imports[i]->timedatestamp = imp.forwarder_chain();
|
||||
c_binary->imports[i]->import_address_table_rva = imp.import_address_table_rva();
|
||||
c_binary->imports[i]->import_lookup_table_rva = imp.import_lookup_table_rva();
|
||||
c_binary->imports[i]->entries = nullptr;
|
||||
init_c_import_entries(c_binary->imports[i], imp);
|
||||
}
|
||||
|
||||
c_binary->imports[imports.size()] = nullptr;
|
||||
}
|
||||
|
||||
|
||||
void destroy_imports(Pe_Binary_t* c_binary) {
|
||||
if (c_binary->imports == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
Pe_Import_t **imports = c_binary->imports;
|
||||
for (size_t idx = 0; imports[idx] != nullptr; ++idx) {
|
||||
destroy_import_entries(imports[idx]);
|
||||
free(imports[idx]);
|
||||
}
|
||||
free(c_binary->imports);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_PE_IMPORT_CPP_C_API_
|
||||
#define LIEF_PE_IMPORT_CPP_C_API_
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
#include "LIEF/PE/Import.h"
|
||||
#include "LIEF/PE/Import.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_imports(Pe_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_imports(Pe_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,57 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "ImportEntry.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_import_entries(Pe_Import_t* c_import, Import& imp) {
|
||||
|
||||
it_import_entries entries = imp.entries();
|
||||
|
||||
c_import->entries = static_cast<Pe_ImportEntry_t**>(
|
||||
malloc((entries.size() + 1) * sizeof(Pe_ImportEntry_t**)));
|
||||
|
||||
for (size_t i = 0; i < entries.size(); ++i) {
|
||||
ImportEntry& import_entry = entries[i];
|
||||
c_import->entries[i] = static_cast<Pe_ImportEntry_t*>(malloc(sizeof(Pe_ImportEntry_t)));
|
||||
|
||||
c_import->entries[i]->is_ordinal = import_entry.is_ordinal();
|
||||
c_import->entries[i]->name = import_entry.is_ordinal() ? nullptr : import_entry.name().c_str();
|
||||
c_import->entries[i]->ordinal = import_entry.is_ordinal() ? import_entry.ordinal() : 0;
|
||||
c_import->entries[i]->hint_name_rva = import_entry.hint_name_rva();
|
||||
c_import->entries[i]->hint = import_entry.hint();
|
||||
c_import->entries[i]->iat_value = import_entry.iat_value();
|
||||
c_import->entries[i]->data = import_entry.data();
|
||||
c_import->entries[i]->iat_address = import_entry.iat_address();
|
||||
}
|
||||
|
||||
c_import->entries[entries.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void destroy_import_entries(Pe_Import_t* c_import) {
|
||||
Pe_ImportEntry_t **entries = c_import->entries;
|
||||
for (size_t idx = 0; entries[idx] != nullptr; ++idx) {
|
||||
free(entries[idx]);
|
||||
}
|
||||
free(c_import->entries);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_PE_IMPORT_ENTRY_CPP_C_API_
|
||||
#define LIEF_PE_IMPORT_ENTRY_CPP_C_API_
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
#include "LIEF/PE/ImportEntry.h"
|
||||
#include "LIEF/PE/ImportEntry.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_import_entries(Pe_Import_t* c_import, Import& imp);
|
||||
void destroy_import_entries(Pe_Import_t* c_import);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,61 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "OptionalHeader.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_optional_header(Pe_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
const OptionalHeader& optional_header = binary->optional_header();
|
||||
c_binary->optional_header.magic = static_cast<enum LIEF_PE_PE_TYPES>(optional_header.magic());
|
||||
c_binary->optional_header.major_linker_version = optional_header.major_linker_version();
|
||||
c_binary->optional_header.minor_linker_version = optional_header.minor_linker_version();
|
||||
c_binary->optional_header.sizeof_code = optional_header.sizeof_code();
|
||||
c_binary->optional_header.sizeof_initialized_data = optional_header.sizeof_initialized_data();
|
||||
c_binary->optional_header.sizeof_uninitialized_data = optional_header.sizeof_uninitialized_data();
|
||||
c_binary->optional_header.addressof_entrypoint = optional_header.addressof_entrypoint();
|
||||
c_binary->optional_header.baseof_code = optional_header.baseof_code();
|
||||
if (optional_header.magic() == PE_TYPE::PE32) {
|
||||
c_binary->optional_header.baseof_data = optional_header.baseof_data();
|
||||
} else {
|
||||
c_binary->optional_header.baseof_data = 0;
|
||||
}
|
||||
c_binary->optional_header.imagebase = optional_header.imagebase();
|
||||
c_binary->optional_header.section_alignment = optional_header.section_alignment();
|
||||
c_binary->optional_header.file_alignment = optional_header.file_alignment();
|
||||
c_binary->optional_header.major_operating_system_version = optional_header.major_operating_system_version();
|
||||
c_binary->optional_header.minor_operating_system_version = optional_header.minor_operating_system_version();
|
||||
c_binary->optional_header.major_image_version = optional_header.major_image_version();
|
||||
c_binary->optional_header.minor_image_version = optional_header.minor_image_version();
|
||||
c_binary->optional_header.major_subsystem_version = optional_header.major_subsystem_version();
|
||||
c_binary->optional_header.minor_subsystem_version = optional_header.minor_subsystem_version();
|
||||
c_binary->optional_header.win32_version_value = optional_header.win32_version_value();
|
||||
c_binary->optional_header.sizeof_image = optional_header.sizeof_image();
|
||||
c_binary->optional_header.sizeof_headers = optional_header.sizeof_headers();
|
||||
c_binary->optional_header.checksum = optional_header.checksum();
|
||||
c_binary->optional_header.subsystem = static_cast<enum LIEF_PE_SUBSYSTEM>(optional_header.subsystem());
|
||||
c_binary->optional_header.dll_characteristics = optional_header.dll_characteristics();
|
||||
c_binary->optional_header.sizeof_stack_reserve = optional_header.sizeof_stack_reserve();
|
||||
c_binary->optional_header.sizeof_stack_commit = optional_header.sizeof_stack_commit();
|
||||
c_binary->optional_header.sizeof_heap_reserve = optional_header.sizeof_heap_reserve();
|
||||
c_binary->optional_header.sizeof_heap_commit = optional_header.sizeof_heap_commit();
|
||||
c_binary->optional_header.loader_flags = optional_header.loader_flags();
|
||||
c_binary->optional_header.numberof_rva_and_size = optional_header.numberof_rva_and_size();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_PE_OPTIONAL_HEADER_CPP_C_API_
|
||||
#define LIEF_PE_OPTIONAL_HEADER_CPP_C_API_
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
#include "LIEF/PE/OptionalHeader.h"
|
||||
#include "LIEF/PE/OptionalHeader.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_optional_header(Pe_Binary_t* c_binary, Binary* binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,73 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "Section.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
void init_c_sections(Pe_Binary_t* c_binary, Binary* binary) {
|
||||
|
||||
it_sections sections = binary->sections();
|
||||
|
||||
c_binary->sections = static_cast<Pe_Section_t**>(
|
||||
malloc((sections.size() + 1) * sizeof(Pe_Section_t**)));
|
||||
|
||||
for (size_t i = 0; i < sections.size(); ++i) {
|
||||
Section& b_section = sections[i];
|
||||
c_binary->sections[i] = static_cast<Pe_Section_t*>(malloc(sizeof(Pe_Section_t)));
|
||||
std::vector<uint8_t> section_content = b_section.content();
|
||||
uint8_t* content = nullptr;
|
||||
|
||||
if (section_content.size() > 0) {
|
||||
content = static_cast<uint8_t*>(malloc(section_content.size() * sizeof(uint8_t)));
|
||||
std::move(
|
||||
std::begin(section_content),
|
||||
std::end(section_content),
|
||||
content);
|
||||
}
|
||||
|
||||
c_binary->sections[i]->name = b_section.name().c_str();
|
||||
c_binary->sections[i]->virtual_address = b_section.virtual_address();
|
||||
c_binary->sections[i]->size = b_section.size();
|
||||
c_binary->sections[i]->offset = b_section.offset();
|
||||
c_binary->sections[i]->virtual_size = b_section.virtual_size();
|
||||
c_binary->sections[i]->pointerto_relocation = b_section.pointerto_relocation();
|
||||
c_binary->sections[i]->pointerto_line_numbers = b_section.pointerto_line_numbers();
|
||||
c_binary->sections[i]->characteristics = b_section.characteristics();
|
||||
c_binary->sections[i]->content = content;
|
||||
c_binary->sections[i]->content_size = section_content.size();
|
||||
c_binary->sections[i]->entropy = b_section.entropy();
|
||||
}
|
||||
c_binary->sections[sections.size()] = nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void destroy_sections(Pe_Binary_t* c_binary) {
|
||||
|
||||
Pe_Section_t **sections = c_binary->sections;
|
||||
for (size_t idx = 0; sections[idx] != nullptr; ++idx) {
|
||||
free(sections[idx]->content);
|
||||
free(sections[idx]);
|
||||
}
|
||||
free(c_binary->sections);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef LIEF_PE_SECTION_CPP_C_API_
|
||||
#define LIEF_PE_SECTION_CPP_C_API_
|
||||
|
||||
#include "LIEF/PE/Binary.h"
|
||||
#include "LIEF/PE/Binary.hpp"
|
||||
|
||||
#include "LIEF/PE/Section.h"
|
||||
#include "LIEF/PE/Section.hpp"
|
||||
|
||||
namespace LIEF {
|
||||
namespace PE {
|
||||
|
||||
void init_c_sections(Pe_Binary_t* c_binary, Binary* binary);
|
||||
void destroy_sections(Pe_Binary_t* c_binary);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,28 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef C_LIEF_ELF_H_
|
||||
#define C_LIEF_ELF_H_
|
||||
|
||||
//! @defgroup elf_c_api ELF C API
|
||||
|
||||
#include "LIEF/ELF/Binary.h"
|
||||
#include "LIEF/ELF/Symbol.h"
|
||||
#include "LIEF/ELF/Section.h"
|
||||
#include "LIEF/ELF/Header.h"
|
||||
#include "LIEF/ELF/DynamicEntry.h"
|
||||
#include "LIEF/ELF/EnumToString.h"
|
||||
#include "LIEF/ELF/utils.h"
|
||||
#endif
|
||||
@@ -0,0 +1,79 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef C_LIEF_ELF_BINARY_H_
|
||||
#define C_LIEF_ELF_BINARY_H_
|
||||
|
||||
/** @defgroup elf_binary_c_api Binary
|
||||
* @ingroup elf_c_api
|
||||
* @addtogroup elf_binary_c_api
|
||||
* @brief Binary C API
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "LIEF/visibility.h"
|
||||
|
||||
#include "LIEF/ELF/enums.h"
|
||||
|
||||
#include "LIEF/ELF/Section.h"
|
||||
#include "LIEF/ELF/Segment.h"
|
||||
#include "LIEF/ELF/Header.h"
|
||||
#include "LIEF/ELF/DynamicEntry.h"
|
||||
#include "LIEF/ELF/Symbol.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** @brief LIEF::ELF::Binary C Handler */
|
||||
struct Elf_Binary_t {
|
||||
void* handler;
|
||||
const char* name;
|
||||
const char* interpreter;
|
||||
enum LIEF_ELF_ELF_CLASS type;
|
||||
Elf_Header_t header;
|
||||
Elf_Section_t **sections;
|
||||
Elf_Segment_t **segments;
|
||||
Elf_DynamicEntry_t **dynamic_entries;
|
||||
Elf_Symbol_t **dynamic_symbols;
|
||||
Elf_Symbol_t **static_symbols;
|
||||
};
|
||||
|
||||
typedef struct Elf_Binary_t Elf_Binary_t;
|
||||
|
||||
/** @brief Wrapper for LIEF::ELF::Parser::parse */
|
||||
LIEF_API Elf_Binary_t* elf_parse(const char *file);
|
||||
|
||||
LIEF_API void elf_binary_destroy(Elf_Binary_t* binary);
|
||||
|
||||
/* ELF::Binary methods
|
||||
* ==================
|
||||
*/
|
||||
|
||||
/** @brief Update LIEF::ELF::Header object */
|
||||
LIEF_API int elf_binary_save_header(Elf_Binary_t* binary);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/** @} */
|
||||
#endif
|
||||
@@ -0,0 +1,92 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef C_LIEF_ELF_DYNAMIC_ENTRY_H_
|
||||
#define C_LIEF_ELF_DYNAMIC_ENTRY_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "LIEF/ELF/enums.h"
|
||||
|
||||
/** @defgroup elf_dynamic_entry_c_api Dynamic Entry
|
||||
* @ingroup elf_c_api
|
||||
* @addtogroup elf_dynamic_entry_c_api
|
||||
* @brief Dynamic Entry C API
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct Elf_DynamicEntry_t {
|
||||
enum LIEF_ELF_DYNAMIC_TAGS tag;
|
||||
uint64_t value;
|
||||
};
|
||||
|
||||
struct Elf_DynamicEntry_Library_t {
|
||||
enum LIEF_ELF_DYNAMIC_TAGS tag;
|
||||
uint64_t value;
|
||||
const char* name;
|
||||
};
|
||||
|
||||
struct Elf_DynamicEntry_SharedObject_t {
|
||||
enum LIEF_ELF_DYNAMIC_TAGS tag;
|
||||
uint64_t value;
|
||||
const char* name;
|
||||
};
|
||||
|
||||
struct Elf_DynamicEntry_Array_t {
|
||||
enum LIEF_ELF_DYNAMIC_TAGS tag;
|
||||
uint64_t value;
|
||||
uint64_t* array;
|
||||
};
|
||||
|
||||
struct Elf_DynamicEntry_Rpath_t {
|
||||
enum LIEF_ELF_DYNAMIC_TAGS tag;
|
||||
uint64_t value;
|
||||
const char* rpath;
|
||||
};
|
||||
|
||||
struct Elf_DynamicEntry_RunPath_t {
|
||||
enum LIEF_ELF_DYNAMIC_TAGS tag;
|
||||
uint64_t value;
|
||||
const char* runpath;
|
||||
};
|
||||
|
||||
|
||||
struct Elf_DynamicEntry_Flags_t {
|
||||
enum LIEF_ELF_DYNAMIC_TAGS tag;
|
||||
uint64_t value;
|
||||
enum LIEF_ELF_DYNAMIC_FLAGS *flags;
|
||||
enum LIEF_ELF_DYNAMIC_FLAGS_1 *flags_1;
|
||||
};
|
||||
|
||||
typedef struct Elf_DynamicEntry_t Elf_DynamicEntry_t;
|
||||
typedef struct Elf_DynamicEntry_Library_t Elf_DynamicEntry_Library_t;
|
||||
typedef struct Elf_DynamicEntry_SharedObject_t Elf_DynamicEntry_SharedObject_t;
|
||||
typedef struct Elf_DynamicEntry_Array_t Elf_DynamicEntry_Array_t;
|
||||
typedef struct Elf_DynamicEntry_Rpath_t Elf_DynamicEntry_Rpath_t;
|
||||
typedef struct Elf_DynamicEntry_RunPath_t Elf_DynamicEntry_RunPath_t;
|
||||
typedef struct Elf_DynamicEntry_Flags_t Elf_DynamicEntry_Flags_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
#endif
|
||||
@@ -0,0 +1,47 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef C_LIEF_ELF_ENUM_TO_STRING_H_
|
||||
#define C_LIEF_ELF_ENUM_TO_STRING_H_
|
||||
|
||||
#include "LIEF/visibility.h"
|
||||
|
||||
#include "LIEF/ELF/enums.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
LIEF_API const char* SYMBOL_BINDINGS_to_string(enum LIEF_ELF_SYMBOL_BINDINGS e);
|
||||
LIEF_API const char* E_TYPE_to_string(enum LIEF_ELF_E_TYPE e);
|
||||
LIEF_API const char* VERSION_to_string(enum LIEF_ELF_VERSION e);
|
||||
LIEF_API const char* ARCH_to_string(enum LIEF_ELF_ARCH e);
|
||||
LIEF_API const char* SEGMENT_TYPES_to_string(enum LIEF_ELF_SEGMENT_TYPES e);
|
||||
LIEF_API const char* DYNAMIC_TAGS_to_string(enum LIEF_ELF_DYNAMIC_TAGS e);
|
||||
LIEF_API const char* ELF_SECTION_TYPES_to_string(enum LIEF_ELF_ELF_SECTION_TYPES e);
|
||||
LIEF_API const char* ELF_SECTION_FLAGS_to_string(enum LIEF_ELF_ELF_SECTION_FLAGS e);
|
||||
LIEF_API const char* ELF_SYMBOL_TYPES_to_string(enum LIEF_ELF_ELF_SYMBOL_TYPES e);
|
||||
LIEF_API const char* ELF_CLASS_to_string(enum LIEF_ELF_ELF_CLASS e);
|
||||
LIEF_API const char* ELF_DATA_to_string(enum LIEF_ELF_ELF_DATA e);
|
||||
LIEF_API const char* OS_ABI_to_string(enum LIEF_ELF_OS_ABI e);
|
||||
LIEF_API const char* DYNAMIC_FLAGS_to_string(enum LIEF_ELF_DYNAMIC_FLAGS e);
|
||||
LIEF_API const char* DYNAMIC_FLAGS_1_to_string(enum LIEF_ELF_DYNAMIC_FLAGS_1 e);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,58 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef C_LIEF_ELF_HEADER_H_
|
||||
#define C_LIEF_ELF_HEADER_H_
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "LIEF/ELF/enums.h"
|
||||
/** @defgroup elf_header_c_api Header
|
||||
* @ingroup elf_c_api
|
||||
* @addtogroup elf_header_c_api
|
||||
* @brief Header C API
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct Elf_Header_t {
|
||||
uint8_t identity[LIEF_ELF_EI_NIDENT];
|
||||
enum LIEF_ELF_E_TYPE file_type;
|
||||
enum LIEF_ELF_ARCH machine_type;
|
||||
enum LIEF_ELF_VERSION object_file_version;
|
||||
uint64_t entrypoint;
|
||||
uint64_t program_headers_offset;
|
||||
uint64_t section_headers_offset;
|
||||
uint32_t processor_flags;
|
||||
uint32_t header_size;
|
||||
uint32_t program_header_size;
|
||||
uint32_t numberof_segments;
|
||||
uint32_t section_header_size;
|
||||
uint32_t numberof_sections;
|
||||
uint32_t name_string_table_idx;
|
||||
};
|
||||
|
||||
typedef struct Elf_Header_t Elf_Header_t;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
#endif
|
||||
@@ -0,0 +1,58 @@
|
||||
/* Copyright 2017 - 2021 R. Thomas
|
||||
* Copyright 2017 - 2021 Quarkslab
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef C_LIEF_ELF_SECTION_H_
|
||||
#define C_LIEF_ELF_SECTION_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "LIEF/ELF/enums.h"
|
||||
|
||||
/** @defgroup elf_section_c_api Section
|
||||
* @ingroup elf_c_api
|
||||
* @addtogroup elf_section_c_api
|
||||
* @brief Section C API
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct Elf_Section_t {
|
||||
const char* name;
|
||||
uint32_t flags;
|
||||
enum LIEF_ELF_ELF_SECTION_TYPES type;
|
||||
uint64_t virtual_address;
|
||||
uint64_t offset;
|
||||
uint64_t original_size;
|
||||
uint32_t link;
|
||||
uint32_t info;
|
||||
uint64_t alignment;
|
||||
uint64_t entry_size;
|
||||
uint64_t size;
|
||||
uint8_t* content;
|
||||
double entropy;
|
||||
};
|
||||
|
||||
typedef struct Elf_Section_t Elf_Section_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user