Skip to content

Commit fed41b7

Browse files
committed
Merge bitcoin/bitcoin#32431: deps: Bump lief to 0.16.6
4f56c91 refactor: contrib: Move FORTIFY check to BASE_ELF (David Gumberg) f6d25e8 contrib: Re-enable FORTIFY check for RISCV (David Gumberg) 765922d deps: bump lief to 0.16.6 (David Gumberg) Pull request description: Partially resolves bitcoin/bitcoin#30520, updating `lief` to 0.16.6. ACKs for top commit: fanquake: ACK 4f56c91 Tree-SHA512: f88dde626975044cee6c78f019dffe063d466c59d81bae0c1aee8a4964eb94d84e5197242e0ae05f130b3925955ac7406f47f8a222a128be7b5865f16ce7bdb6
2 parents c8abd97 + 4f56c91 commit fed41b7

File tree

5 files changed

+97
-68
lines changed

5 files changed

+97
-68
lines changed

ci/lint/04_install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ python3 --version
3838

3939
${CI_RETRY_EXE} pip3 install \
4040
codespell==2.4.1 \
41-
lief==0.13.2 \
41+
lief==0.16.6 \
4242
mypy==1.4.1 \
4343
pyzmq==25.1.0 \
4444
ruff==0.5.5 \

contrib/guix/manifest.scm

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
(gnu packages ninja)
1616
(gnu packages pkg-config)
1717
((gnu packages python) #:select (python-minimal))
18-
((gnu packages python-build) #:select (python-tomli python-poetry-core))
18+
((gnu packages python-build) #:select (python-poetry-core))
1919
((gnu packages python-crypto) #:select (python-asn1crypto))
20+
((gnu packages python-science) #:select (python-scikit-build-core))
21+
((gnu packages python-xyz) #:select (python-pydantic-2 python-pydantic-core))
2022
((gnu packages tls) #:select (openssl))
2123
((gnu packages version-control) #:select (git-minimal))
2224
(guix build-system cmake)
@@ -158,37 +160,35 @@ chain for " target " development."))
158160
(define-public python-lief
159161
(package
160162
(name "python-lief")
161-
(version "0.13.2")
163+
(version "0.16.6")
162164
(source (origin
163165
(method git-fetch)
164166
(uri (git-reference
165167
(url "https://github.com/lief-project/LIEF")
166168
(commit version)))
167169
(file-name (git-file-name name version))
168-
(modules '((guix build utils)))
169-
(snippet
170-
'(begin
171-
;; Configure build for Python bindings.
172-
(substitute* "api/python/config-default.toml"
173-
(("(ninja = )true" all m)
174-
(string-append m "false"))
175-
(("(parallel-jobs = )0" all m)
176-
(string-append m (number->string (parallel-job-count)))))))
177170
(sha256
178171
(base32
179-
"0y48x358ppig5xp97ahcphfipx7cg9chldj2q5zrmn610fmi4zll"))))
180-
(build-system python-build-system)
181-
(native-inputs (list cmake-minimal python-tomli))
172+
"1pq9nagrnkl1x943bqnpiyxmkd9vk99znfxiwqp6vf012b50bz2a"))
173+
(patches (search-our-patches "lief-scikit-0-9.patch"))))
174+
(build-system pyproject-build-system)
175+
(native-inputs (list cmake-minimal
176+
ninja
177+
python-scikit-build-core
178+
python-pydantic-core
179+
python-pydantic-2))
182180
(arguments
183181
(list
184182
#:tests? #f ;needs network
185183
#:phases #~(modify-phases %standard-phases
186-
(add-before 'build 'change-directory
184+
(add-before 'build 'set-pythonpath
187185
(lambda _
188-
(chdir "api/python")))
189-
(replace 'build
186+
(setenv "PYTHONPATH"
187+
(string-append (string-append (getcwd) "/api/python/backend")
188+
":" (or (getenv "PYTHONPATH") "")))))
189+
(add-after 'set-pythonpath 'change-directory
190190
(lambda _
191-
(invoke "python" "setup.py" "build"))))))
191+
(chdir "api/python"))))))
192192
(home-page "https://github.com/lief-project/LIEF")
193193
(synopsis "Library to instrument executable formats")
194194
(description
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
Partially revert f23ced2f4ffc170d0a6f40ff4a1bee575e3447cf
2+
3+
Restore compat with python-scikit-build-core 0.9.x
4+
Can be dropped when using python-scikit-build-core >= 0.10.x
5+
6+
--- a/api/python/backend/setup.py
7+
+++ b/api/python/backend/setup.py
8+
@@ -101,12 +101,12 @@ def _get_hooked_config(is_editable: bool) -> Optional[dict[str, Union[str, List[
9+
config_settings = {
10+
"logging.level": "DEBUG",
11+
"build-dir": config.build_dir,
12+
- "build.targets": config.build.targets,
13+
"install.strip": config.strip,
14+
"backport.find-python": "0",
15+
"wheel.py-api": config.build.py_api,
16+
"cmake.source-dir": SRC_DIR.as_posix(),
17+
"cmake.build-type": config.build.build_type,
18+
+ "cmake.targets": config.build.targets,
19+
"cmake.args": [
20+
*config.cmake_generator,
21+
*config.get_cmake_args(is_editable),

contrib/guix/security-check.py

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ def check_ELF_RELRO(binary) -> bool:
3030
# However, the dynamic linker need to write to this area so these are RW.
3131
# Glibc itself takes care of mprotecting this area R after relocations are finished.
3232
# See also https://marc.info/?l=binutils&m=1498883354122353
33-
if segment.type == lief.ELF.SEGMENT_TYPES.GNU_RELRO:
33+
if segment.type == lief.ELF.Segment.TYPE.GNU_RELRO:
3434
have_gnu_relro = True
3535

3636
have_bindnow = False
3737
try:
38-
flags = binary.get(lief.ELF.DYNAMIC_TAGS.FLAGS)
39-
if flags.value & lief.ELF.DYNAMIC_FLAGS.BIND_NOW:
38+
flags = binary.get(lief.ELF.DynamicEntry.TAG.FLAGS)
39+
if flags.has(lief.ELF.DynamicEntryFlags.FLAG.BIND_NOW):
4040
have_bindnow = True
4141
except Exception:
4242
have_bindnow = False
@@ -55,9 +55,9 @@ def check_ELF_SEPARATE_CODE(binary):
5555
based on their permissions. This checks for missing -Wl,-z,separate-code
5656
and potentially other problems.
5757
'''
58-
R = lief.ELF.SEGMENT_FLAGS.R
59-
W = lief.ELF.SEGMENT_FLAGS.W
60-
E = lief.ELF.SEGMENT_FLAGS.X
58+
R = lief.ELF.Segment.FLAGS.R
59+
W = lief.ELF.Segment.FLAGS.W
60+
E = lief.ELF.Segment.FLAGS.X
6161
EXPECTED_FLAGS = {
6262
# Read + execute
6363
'.init': R | E,
@@ -99,7 +99,7 @@ def check_ELF_SEPARATE_CODE(binary):
9999
# and for each section, remember the flags of the associated program header.
100100
flags_per_section = {}
101101
for segment in binary.segments:
102-
if segment.type == lief.ELF.SEGMENT_TYPES.LOAD:
102+
if segment.type == lief.ELF.Segment.TYPE.LOAD:
103103
for section in segment.sections:
104104
flags_per_section[section.name] = segment.flags
105105
# Spot-check ELF LOAD program header flags per section
@@ -144,13 +144,13 @@ def check_ELF_FORTIFY(binary) -> bool:
144144

145145
def check_PE_DYNAMIC_BASE(binary) -> bool:
146146
'''PIE: DllCharacteristics bit 0x40 signifies dynamicbase (ASLR)'''
147-
return lief.PE.DLL_CHARACTERISTICS.DYNAMIC_BASE in binary.optional_header.dll_characteristics_lists
147+
return lief.PE.OptionalHeader.DLL_CHARACTERISTICS.DYNAMIC_BASE in binary.optional_header.dll_characteristics_lists
148148

149149
# Must support high-entropy 64-bit address space layout randomization
150150
# in addition to DYNAMIC_BASE to have secure ASLR.
151151
def check_PE_HIGH_ENTROPY_VA(binary) -> bool:
152152
'''PIE: DllCharacteristics bit 0x20 signifies high-entropy ASLR'''
153-
return lief.PE.DLL_CHARACTERISTICS.HIGH_ENTROPY_VA in binary.optional_header.dll_characteristics_lists
153+
return lief.PE.OptionalHeader.DLL_CHARACTERISTICS.HIGH_ENTROPY_VA in binary.optional_header.dll_characteristics_lists
154154

155155
def check_PE_RELOC_SECTION(binary) -> bool:
156156
'''Check for a reloc section. This is required for functional ASLR.'''
@@ -181,7 +181,7 @@ def check_MACHO_NOUNDEFS(binary) -> bool:
181181
'''
182182
Check for no undefined references.
183183
'''
184-
return binary.header.has(lief.MachO.HEADER_FLAGS.NOUNDEFS)
184+
return binary.header.has(lief.MachO.Header.FLAGS.NOUNDEFS)
185185

186186
def check_MACHO_FIXUP_CHAINS(binary) -> bool:
187187
'''
@@ -206,7 +206,13 @@ def check_NX(binary) -> bool:
206206
'''
207207
Check for no stack execution
208208
'''
209-
return binary.has_nx
209+
210+
# binary.has_nx checks are only for the stack, but MachO binaries might
211+
# have executable heaps.
212+
if binary.format == lief.Binary.FORMATS.MACHO:
213+
return binary.concrete.has_nx_stack and binary.concrete.has_nx_heap
214+
else:
215+
return binary.has_nx
210216

211217
def check_MACHO_CONTROL_FLOW(binary) -> bool:
212218
'''
@@ -229,6 +235,7 @@ def check_MACHO_BRANCH_PROTECTION(binary) -> bool:
229235
return False
230236

231237
BASE_ELF = [
238+
('FORTIFY', check_ELF_FORTIFY),
232239
('PIE', check_PIE),
233240
('NX', check_NX),
234241
('RELRO', check_ELF_RELRO),
@@ -253,31 +260,31 @@ def check_MACHO_BRANCH_PROTECTION(binary) -> bool:
253260
]
254261

255262
CHECKS = {
256-
lief.EXE_FORMATS.ELF: {
257-
lief.ARCHITECTURES.X86: BASE_ELF + [('CONTROL_FLOW', check_ELF_CONTROL_FLOW), ('FORTIFY', check_ELF_FORTIFY)],
258-
lief.ARCHITECTURES.ARM: BASE_ELF + [('FORTIFY', check_ELF_FORTIFY)],
259-
lief.ARCHITECTURES.ARM64: BASE_ELF + [('FORTIFY', check_ELF_FORTIFY)],
260-
lief.ARCHITECTURES.PPC: BASE_ELF + [('FORTIFY', check_ELF_FORTIFY)],
261-
lief.ARCHITECTURES.RISCV: BASE_ELF, # Skip FORTIFY. See https://github.com/lief-project/LIEF/issues/1082.
263+
lief.Binary.FORMATS.ELF: {
264+
lief.Header.ARCHITECTURES.X86_64: BASE_ELF + [('CONTROL_FLOW', check_ELF_CONTROL_FLOW)],
265+
lief.Header.ARCHITECTURES.ARM: BASE_ELF,
266+
lief.Header.ARCHITECTURES.ARM64: BASE_ELF,
267+
lief.Header.ARCHITECTURES.PPC64: BASE_ELF,
268+
lief.Header.ARCHITECTURES.RISCV: BASE_ELF,
262269
},
263-
lief.EXE_FORMATS.PE: {
264-
lief.ARCHITECTURES.X86: BASE_PE,
270+
lief.Binary.FORMATS.PE: {
271+
lief.Header.ARCHITECTURES.X86_64: BASE_PE,
265272
},
266-
lief.EXE_FORMATS.MACHO: {
267-
lief.ARCHITECTURES.X86: BASE_MACHO + [('PIE', check_PIE),
273+
lief.Binary.FORMATS.MACHO: {
274+
lief.Header.ARCHITECTURES.X86_64: BASE_MACHO + [('PIE', check_PIE),
268275
('NX', check_NX),
269276
('CONTROL_FLOW', check_MACHO_CONTROL_FLOW)],
270-
lief.ARCHITECTURES.ARM64: BASE_MACHO + [('BRANCH_PROTECTION', check_MACHO_BRANCH_PROTECTION)],
277+
lief.Header.ARCHITECTURES.ARM64: BASE_MACHO + [('BRANCH_PROTECTION', check_MACHO_BRANCH_PROTECTION)],
271278
}
272279
}
273280

274281
if __name__ == '__main__':
275282
retval: int = 0
276283
for filename in sys.argv[1:]:
277284
binary = lief.parse(filename)
285+
278286
etype = binary.format
279287
arch = binary.abstract.header.architecture
280-
binary.concrete
281288

282289
failed: list[str] = []
283290
for (name, func) in CHECKS[etype][arch]:

contrib/guix/symbol-check.py

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
MAX_VERSIONS = {
3535
'GCC': (4,3,0),
3636
'GLIBC': {
37-
lief.ELF.ARCH.x86_64: (2,31),
37+
lief.ELF.ARCH.X86_64: (2,31),
3838
lief.ELF.ARCH.ARM: (2,31),
3939
lief.ELF.ARCH.AARCH64:(2,31),
4040
lief.ELF.ARCH.PPC64: (2,31),
@@ -52,41 +52,41 @@
5252

5353
# Expected linker-loader names can be found here:
5454
# https://sourceware.org/glibc/wiki/ABIList?action=recall&rev=16
55-
ELF_INTERPRETER_NAMES: dict[lief.ELF.ARCH, dict[lief.ENDIANNESS, str]] = {
56-
lief.ELF.ARCH.x86_64: {
57-
lief.ENDIANNESS.LITTLE: "/lib64/ld-linux-x86-64.so.2",
55+
ELF_INTERPRETER_NAMES: dict[lief.ELF.ARCH, dict[lief.Header.ENDIANNESS, str]] = {
56+
lief.ELF.ARCH.X86_64: {
57+
lief.Header.ENDIANNESS.LITTLE: "/lib64/ld-linux-x86-64.so.2",
5858
},
5959
lief.ELF.ARCH.ARM: {
60-
lief.ENDIANNESS.LITTLE: "/lib/ld-linux-armhf.so.3",
60+
lief.Header.ENDIANNESS.LITTLE: "/lib/ld-linux-armhf.so.3",
6161
},
6262
lief.ELF.ARCH.AARCH64: {
63-
lief.ENDIANNESS.LITTLE: "/lib/ld-linux-aarch64.so.1",
63+
lief.Header.ENDIANNESS.LITTLE: "/lib/ld-linux-aarch64.so.1",
6464
},
6565
lief.ELF.ARCH.PPC64: {
66-
lief.ENDIANNESS.BIG: "/lib64/ld64.so.1",
67-
lief.ENDIANNESS.LITTLE: "/lib64/ld64.so.2",
66+
lief.Header.ENDIANNESS.BIG: "/lib64/ld64.so.1",
67+
lief.Header.ENDIANNESS.LITTLE: "/lib64/ld64.so.2",
6868
},
6969
lief.ELF.ARCH.RISCV: {
70-
lief.ENDIANNESS.LITTLE: "/lib/ld-linux-riscv64-lp64d.so.1",
70+
lief.Header.ENDIANNESS.LITTLE: "/lib/ld-linux-riscv64-lp64d.so.1",
7171
},
7272
}
7373

74-
ELF_ABIS: dict[lief.ELF.ARCH, dict[lief.ENDIANNESS, list[int]]] = {
75-
lief.ELF.ARCH.x86_64: {
76-
lief.ENDIANNESS.LITTLE: [3,2,0],
74+
ELF_ABIS: dict[lief.ELF.ARCH, dict[lief.Header.ENDIANNESS, list[int]]] = {
75+
lief.ELF.ARCH.X86_64: {
76+
lief.Header.ENDIANNESS.LITTLE: [3,2,0],
7777
},
7878
lief.ELF.ARCH.ARM: {
79-
lief.ENDIANNESS.LITTLE: [3,2,0],
79+
lief.Header.ENDIANNESS.LITTLE: [3,2,0],
8080
},
8181
lief.ELF.ARCH.AARCH64: {
82-
lief.ENDIANNESS.LITTLE: [3,7,0],
82+
lief.Header.ENDIANNESS.LITTLE: [3,7,0],
8383
},
8484
lief.ELF.ARCH.PPC64: {
85-
lief.ENDIANNESS.LITTLE: [3,10,0],
86-
lief.ENDIANNESS.BIG: [3,2,0],
85+
lief.Header.ENDIANNESS.LITTLE: [3,10,0],
86+
lief.Header.ENDIANNESS.BIG: [3,2,0],
8787
},
8888
lief.ELF.ARCH.RISCV: {
89-
lief.ENDIANNESS.LITTLE: [4,15,0],
89+
lief.Header.ENDIANNESS.LITTLE: [4,15,0],
9090
},
9191
}
9292

@@ -223,13 +223,13 @@ def check_exported_symbols(binary) -> bool:
223223
name = symbol.name
224224
if binary.header.machine_type == lief.ELF.ARCH.RISCV or name in IGNORE_EXPORTS:
225225
continue
226-
print(f'{binary.name}: export of symbol {name} not allowed!')
226+
print(f'{filename}: export of symbol {name} not allowed!')
227227
ok = False
228228
return ok
229229

230230
def check_RUNPATH(binary) -> bool:
231-
assert binary.get(lief.ELF.DYNAMIC_TAGS.RUNPATH) is None
232-
assert binary.get(lief.ELF.DYNAMIC_TAGS.RPATH) is None
231+
assert binary.get(lief.ELF.DynamicEntry.TAG.RUNPATH) is None
232+
assert binary.get(lief.ELF.DynamicEntry.TAG.RPATH) is None
233233
return True
234234

235235
def check_ELF_libraries(binary) -> bool:
@@ -294,26 +294,26 @@ def check_ELF_interpreter(binary) -> bool:
294294

295295
def check_ELF_ABI(binary) -> bool:
296296
expected_abi = ELF_ABIS[binary.header.machine_type][binary.abstract.header.endianness]
297-
note = binary.concrete.get(lief.ELF.NOTE_TYPES.ABI_TAG)
298-
assert note.details.abi == lief.ELF.NOTE_ABIS.LINUX
299-
return note.details.version == expected_abi
297+
note = binary.concrete.get(lief.ELF.Note.TYPE.GNU_ABI_TAG)
298+
assert note.abi == lief.ELF.NoteAbi.ABI.LINUX
299+
return note.version == expected_abi
300300

301301
CHECKS = {
302-
lief.EXE_FORMATS.ELF: [
302+
lief.Binary.FORMATS.ELF: [
303303
('IMPORTED_SYMBOLS', check_imported_symbols),
304304
('EXPORTED_SYMBOLS', check_exported_symbols),
305305
('LIBRARY_DEPENDENCIES', check_ELF_libraries),
306306
('INTERPRETER_NAME', check_ELF_interpreter),
307307
('ABI', check_ELF_ABI),
308308
('RUNPATH', check_RUNPATH),
309309
],
310-
lief.EXE_FORMATS.MACHO: [
310+
lief.Binary.FORMATS.MACHO: [
311311
('DYNAMIC_LIBRARIES', check_MACHO_libraries),
312312
('MIN_OS', check_MACHO_min_os),
313313
('SDK', check_MACHO_sdk),
314314
('LLD', check_MACHO_lld),
315315
],
316-
lief.EXE_FORMATS.PE: [
316+
lief.Binary.FORMATS.PE: [
317317
('DYNAMIC_LIBRARIES', check_PE_libraries),
318318
('SUBSYSTEM_VERSION', check_PE_subsystem_version),
319319
('APPLICATION_MANIFEST', check_PE_application_manifest),
@@ -324,6 +324,7 @@ def check_ELF_ABI(binary) -> bool:
324324
retval: int = 0
325325
for filename in sys.argv[1:]:
326326
binary = lief.parse(filename)
327+
327328
etype = binary.format
328329

329330
failed: list[str] = []

0 commit comments

Comments
 (0)