CMakeの使い方2

good_morning.hpp

#ifndef GOOD_MORNING_H
#define GOOD_MORNING_H

void good_morning();

#endif

good_morning.cpp

#include <iostream>
#include "good_morning.hpp"

void good_morning() {
    std::cout << "Good Monring!" << std::endl;
}

main.cpp

#include "hello.hpp"
#include "good_morning.hpp"

int main(){
    hello();
    good_morning();
}

$ g++ -c hello.cpp good_morning.cpp
$ ar rvs libgreetings.a hello.o good_morning.o
ar: creating libgreetings.a
a – hello.o
a – good_morning.o
$ g++ main.cpp libgreetings.a
$ ./a.out
Hello!
Good Monring!

CMakeの使い方

main.cpp

#include "hello.hpp"

int main(){
    hello();
}

hello.hpp

#ifndef HELLO_H
#define HELLO_H

void hello();

#endif

hello.cpp

#include <iostream>
#include "hello.hpp"

void hello() {
    std::cout << "Hello!" << std::endl;
}

### g++でビルドする場合
$ g++ -c main.cpp hello.cpp
$ g++ -o a.out main.o hello.o
$ ./a.out
Hello!

### CMake
CMakeLists.txtを作成する

CMakeLists.txt

# CMakeバージョン
cmake_minimum_required(VERSION 3.13)
# プロジェクト名と使用する言語
project(test_cmake CXX)
add_executable(a.out main.cpp hello.cpp)

CMakeを使ってビルドする際は、ビルド専用のディレクトリを作成し、その中で行う
$ ls
CMakeLists.txt hello.cpp hello.hpp main.cpp
$ cmake -S . -B build
$ tree
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.22.1
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ ├── CMakeCXXCompilerId.cpp
│ │ │ └── tmp
│ │ ├── a.out.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── compiler_depend.make
│ │ │ ├── compiler_depend.ts
│ │ │ ├── DependInfo.cmake
│ │ │ ├── depend.make
│ │ │ ├── flags.make
│ │ │ ├── link.txt
│ │ │ └── progress.make
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ └── TargetDirectories.txt
│ ├── cmake_install.cmake
│ └── Makefile
├── CMakeLists.txt
├── hello.cpp
├── hello.hpp
└── main.cpp

[Python] import liefとは?

liefはPE、ELFなどの実行ファイルをパースし、一部のレコードの編集を行うためのライブラリ
– 実行ファイルの一部のレコードを編集した上で新しい実行ファイルとして書き出し
– パース可能な実行ファイルフォーマットが多い
– pefile, pyelftoolsなどがあった

### LIEFのインストール(ubutu22.04)
$ git clone https://github.com/lief-project/LIEF.git
$ cd LIEF && mkdir build && cd build
$ sudo apt update
$ sudo apt install cmake
$ sudo apt install ninja-build
※ninjaはbuildを高速化するツール。よくオープンソースのbuildなどに使われる。CPUを効率的に使用しており、複数コアのCPUだと特に速くなる。
※cmakeはコンパイラに依存しない自動化ツール
$ cmake -DLIEF_PYTHON_API=on -DPYTHON_VERSION=3.6 -DCMAKE_BUILD_TYPE=Release -DLIEF_TESTS=on -GNinja ..
$ cd api/python
$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import lief
Traceback (most recent call last):
File ““, line 1, in
ModuleNotFoundError: No module named ‘lief’
>>> exit()

う〜ん、よくわかりませんね。

symbol-check.py

import sys
import lief