Files
termux-packages/packages/libllvm/llvm-lib-Support-Unix-Path.inc.patch
termux-pacman-bot 9b1d8bc03e fix(main/clang): default to using the static library of the address sanitizer instead of the shared library
- Makes the default behavior of on-device building with the address sanitizer match the default behavior of building with the address sanitizer on Clang for Desktop Linux distros, which is to use the static library

- Fixes https://github.com/termux/termux-packages/issues/26485

- On devices that do not have `libclang_rt.asan-$arch-android.so` or which have a corrupted one, fixes building on-device with `-fsanitize=address`

- Samsung Galaxy S III SPH-L710 with LineageOS 14.1 Android 7.1.2 before:

```
~ $ clang test.c -fsanitize=address
~ $ ./a.out
WARNING: linker: /data/data/com.termux/files/home/a.out: unsupported flags DT_FLAGS_1=0x8000001
CANNOT LINK EXECUTABLE "./a.out": library "libclang_rt.asan-arm-android.so" not found
Aborted                    ./a.out
~ $ clang test.c -fsanitize=address -Wl,-rpath=$PREFIX/lib/clang/20/lib/linux
~ $ ./a.out
WARNING: linker: /data/data/com.termux/files/home/a.out: unsupported flags DT_FLAGS_1=0x8000001
~ $ termux-elf-cleaner ./a.out
termux-elf-cleaner: Replacing unsupported DF_1_* flags 134217729 with 1 in './a.out'
~ $ ./a.out
~ $ file /system/lib/libclang_rt.asan-arm-android.so
/system/lib/libclang_rt.asan-arm-android.so: cannot open `/system/lib/libclang_rt.asan-arm-android.so' (No such file or directory)
~ $
```

- After:
```
~ $ clang test.c -fsanitize=address
~ $ ./a.out
WARNING: linker: /data/data/com.termux/files/home/a.out: unsupported flags DT_FLAGS_1=0x8000001
~ $ termux-elf-cleaner a.out
termux-elf-cleaner: Replacing unsupported DF_1_* flags 134217729 with 1 in 'a.out'
~ $ ./a.out
~ $
```

- Vivo iQOO Neo8 V2301A with Android 15 before:

```
thread #1, name = 'a.out', stop reason = signal SIGILL: illegal opcode
```

- After: believed to work
2025-10-13 15:06:11 +00:00

22 lines
1.0 KiB
Diff

diff -u -r ../orig-src/llvm/lib/Support/Unix/Path.inc ./llvm/lib/Support/Unix/Path.inc
--- ../orig-src/llvm/lib/Support/Unix/Path.inc 2023-09-29 21:36:47.056335287 +0000
+++ ./llvm/lib/Support/Unix/Path.inc 2023-09-29 21:40:31.091417185 +0000
@@ -250,6 +250,17 @@
// If we don't have procfs mounted, fall back to argv[0]
if (getprogpath(exe_path, argv0) != NULL)
return exe_path;
+#elif defined(__ANDROID__) // termux-exec linker wrapping does not work with /proc/self/exe
+ const char *termux_self_exe = std::getenv("TERMUX_EXEC__PROC_SELF_EXE");
+ if (termux_self_exe != NULL) return std::string(termux_self_exe);
+ if (char *real_path = realpath("/proc/self/exe", nullptr)) {
+ std::string ret = std::string(real_path);
+ free(real_path);
+ return ret;
+ }
+ // Fall back to the classical detection.
+ char exe_path[PATH_MAX];
+ if (getprogpath(exe_path, argv0)) return exe_path;
#elif defined(__linux__) || defined(__CYGWIN__) || defined(__gnu_hurd__) || \
defined(__managarm__)
char exe_path[PATH_MAX];