41c9a3140e
I thought this would allow insertion with ld.gold, but it turns out that the resulting binary has something wrong with sections. So only the change to the script is committed, because it makes it much easier to experiment with various linkers.
65 lines
1.6 KiB
Bash
Executable File
65 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
readonly=1
|
|
insert_after=1
|
|
|
|
pad_string() {
|
|
for _ in $(seq "$1"); do
|
|
printf ' BYTE(0x00)'
|
|
done
|
|
}
|
|
|
|
write_string() {
|
|
text="$1"
|
|
prefix="$2"
|
|
label="$3"
|
|
total="$4"
|
|
|
|
printf "%s/* %s: '%s' */" "$prefix" "$label" "$text"
|
|
for i in $(seq ${#text}); do
|
|
if (( i % 4 == 1 )); then
|
|
printf '\n%s' "$prefix"
|
|
else
|
|
printf ' '
|
|
fi
|
|
printf 'BYTE(0x%02x)' "'${text:i-1:1}"
|
|
done
|
|
|
|
pad_string $(( total - ${#text} ))
|
|
printf '\n'
|
|
}
|
|
|
|
write_script() {
|
|
value_len=$(( (${#1} + 3) / 4 * 4 ))
|
|
[ -n "$readonly" ] && readonly_attr='(READONLY) '
|
|
|
|
printf 'SECTIONS\n{\n'
|
|
printf ' .note.package %s: ALIGN(4) {\n' "$readonly_attr"
|
|
printf ' BYTE(0x04) BYTE(0x00) BYTE(0x00) BYTE(0x00) /* Length of Owner including NUL */\n'
|
|
printf ' BYTE(0x%02x) BYTE(0x%02x) BYTE(0x00) BYTE(0x00) /* Length of Value including NUL */\n' \
|
|
$((value_len % 256)) $((value_len / 256))
|
|
|
|
printf ' BYTE(0x7e) BYTE(0x1a) BYTE(0xfe) BYTE(0xca) /* Note ID */\n'
|
|
printf " BYTE(0x46) BYTE(0x44) BYTE(0x4f) BYTE(0x00) /* Owner: 'FDO' */\n"
|
|
|
|
write_string "$1" ' ' 'Value' "$value_len"
|
|
|
|
printf ' }\n}\n'
|
|
[ -n "$insert_after" ] && printf 'INSERT AFTER .note.gnu.build-id;\n'
|
|
:
|
|
}
|
|
|
|
if [ "$1" == "--readonly=no" ]; then
|
|
shift
|
|
readonly=
|
|
fi
|
|
|
|
if [ "$1" == "--insert-after=no" ]; then
|
|
shift
|
|
insert_after=
|
|
fi
|
|
|
|
cpe="$(cat /usr/lib/system-release-cpe)"
|
|
json="$(printf '{"type":"rpm","name":"%s","version":"%s","architecture":"%s","osCpe":"%s"}' "$1" "$2" "$3" "$cpe")"
|
|
write_script "$json"
|