summaryrefslogtreecommitdiff
path: root/src/ukify
diff options
context:
space:
mode:
authorDaan De Meyer <daan.j.demeyer@gmail.com>2022-12-19 15:29:43 +0100
committerDaan De Meyer <daan.j.demeyer@gmail.com>2022-12-22 12:20:24 +0100
commit789a642738d28cf2a8ad3f65df9c0c136e83af09 (patch)
tree88b22d58d9315f2effabaa5b9b924ef7286d2034 /src/ukify
parent22ad038ac6e4fe5e4a68555f0e70bd0a16fb5616 (diff)
downloadsystemd-789a642738d28cf2a8ad3f65df9c0c136e83af09.tar.gz
ukify: Prefer using llvm-objcopy instead of objcopy
llvm-objcopy works on stubs built for foreign architectures whereas objcopy doesn't so let's prefer using llvm-objcopy instead of objcopy. llvm-objcopy automatically sets the virtual address and doesn't provide an option to set it manually so we only add --change-section-vma when using objcopy The default section flags differ between llvm-objcopy and objcopy so we add a default for the section flags so we make sure all sections are read-only data unless specified otherwise.
Diffstat (limited to 'src/ukify')
-rwxr-xr-xsrc/ukify/ukify.py21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/ukify/ukify.py b/src/ukify/ukify.py
index 80a4e9c9ca..63e7202d3d 100755
--- a/src/ukify/ukify.py
+++ b/src/ukify/ukify.py
@@ -200,12 +200,12 @@ class Section:
name: str
content: pathlib.Path
tmpfile: typing.IO | None = None
- flags: list[str] | None = dataclasses.field(default=None)
+ flags: list[str] = dataclasses.field(default_factory=lambda: ['data', 'readonly'])
offset: int | None = None
measure: bool = False
@classmethod
- def create(cls, name, contents, flags=None, measure=False):
+ def create(cls, name, contents, **kwargs):
if isinstance(contents, str | bytes):
mode = 'wt' if isinstance(contents, str) else 'wb'
tmp = tempfile.NamedTemporaryFile(mode=mode, prefix=f'tmp{name}')
@@ -215,7 +215,7 @@ class Section:
else:
tmp = None
- return cls(name, contents, tmpfile=tmp, flags=flags, measure=measure)
+ return cls(name, contents, tmpfile=tmp, **kwargs)
@classmethod
def parse_arg(cls, s):
@@ -521,21 +521,22 @@ def make_uki(opts):
else:
output = opts.output
- objcopy_tool = find_tool('objcopy', opts=opts)
+ objcopy_tool = find_tool('llvm-objcopy', 'objcopy', opts=opts)
cmd = [
objcopy_tool,
opts.stub,
*itertools.chain.from_iterable(
- ('--add-section', f'{s.name}={s.content}',
- '--change-section-vma', f'{s.name}=0x{s.offset:x}')
+ ('--add-section', f'{s.name}={s.content}',
+ '--set-section-flags', f"{s.name}={','.join(s.flags)}")
for s in uki.sections),
- *itertools.chain.from_iterable(
- ('--set-section-flags', f"{s.name}={','.join(s.flags)}")
- for s in uki.sections
- if s.flags is not None),
output,
]
+
+ if pathlib.Path(objcopy_tool).name != 'llvm-objcopy':
+ cmd += itertools.chain.from_iterable(
+ ('--change-section-vma', f'{s.name}=0x{s.offset:x}') for s in uki.sections)
+
print('+', shell_join(cmd))
subprocess.check_call(cmd)