1
1
mirror of https://github.com/rui314/mold.git synced 2024-10-04 08:37:28 +03:00

[Mach-O] Compute LC_UUID using the entire code signature section

We used to compute a file UUID using only the hashes in the code
signature section. So we computes the same UUID even if two files
are differnet only in some field of the code signature section.
This commit is contained in:
Rui Ueyama 2022-06-22 20:29:02 +08:00
parent 9cd811393f
commit 9a3188bcf5
2 changed files with 30 additions and 1 deletions

View File

@ -1158,7 +1158,7 @@ void CodeSignatureSection<E>::write_signature(Context<E> &ctx) {
// entire file. We compute its value as a tree hash.
if (ctx.arg.uuid == UUID_HASH) {
u8 uuid[SHA256_SIZE];
SHA256(buf, num_blocks * SHA256_SIZE, uuid);
SHA256(ctx.buf + this->hdr.offset, this->hdr.size, uuid);
// Indicate that this is UUIDv4 as defined by RFC4122.
uuid[6] = (uuid[6] & 0b00001111) | 0b01010000;

29
test/macho/uuid2.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/bash
export LC_ALL=C
set -e
CC="${TEST_CC:-cc}"
CXX="${TEST_CXX:-c++}"
GCC="${TEST_GCC:-gcc}"
GXX="${TEST_GXX:-g++}"
OBJDUMP="${OBJDUMP:-objdump}"
MACHINE="${MACHINE:-$(uname -m)}"
testname=$(basename "$0" .sh)
echo -n "Testing $testname ... "
cd "$(dirname "$0")"/../..
t=out/test/macho/$testname
mkdir -p $t
cat <<EOF | $CC -c -o $t/a.o -xc -
#include <stdio.h>
int main() {
printf("Hello world\n");
}
EOF
clang --ld-path=./ld64 -B. -o $t/exe1 $t/a.o -Wl,-adhoc_codesign
clang --ld-path=./ld64 -B. -o $t/exe2 $t/a.o -Wl,-adhoc_codesign
[ "$(otool -l $t/exe1 | grep 'uuid ')" != "$(otool -l $t/exe2 | grep 'uuid ')" ]
echo OK