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}')
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):
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)