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:
parent
9cd811393f
commit
9a3188bcf5
@ -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
29
test/macho/uuid2.sh
Executable 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
|
Loading…
Reference in New Issue
Block a user