这两个 cases 在 rvi upstream 的 emulator 环境下执行的结果是导致 Segmentation fault
bionic-unit-tests-static 中没有,只有 bionic-unit-tests 会失败
在 aosp-riscv 的 qemu 中运行正常。
[ RUN ] ifunc.function
ifunc.function terminated by signal: Segmentation fault.
[ FAILED ] ifunc.function (6928 ms)
[ RUN ] ifunc.hwcap
ifunc.hwcap terminated by signal: Segmentation fault.
[ FAILED ] ifunc.hwcap (16672 ms)
发现 RVI upstream 和 aosp-riscv 的 clang 编译出来的结果不太一样,特别的 RVI upstream:
$ riscv64-unknown-linux-gnu-readelf -r out/target/product/emulator_riscv64/symbols/data/nativetest64/bionic-unit-tests/bionic-unit-tests | grep R_RISCV_IRELATIVE
$ riscv64-unknown-linux-gnu-readelf -r out/target/product/emulator_riscv64/symbols/data/nativetest64/bionic-unit-tests/bionic-unit-tests | grep R_RISCV_NONE
00000074cf08 000000000000 R_RISCV_NONE 2d17c2
00000074cf10 000000000000 R_RISCV_NONE 2d18e6
$ riscv64-unknown-linux-gnu-objdump -d out/target/product/emulator_riscv64/symbols/data/nativetest64/bionic-unit-tests/bionic-unit-tests | grep -wn resolver
233094:00000000002d17c2 <resolver>:
wangchen@plct-8:/aosp/wangchen/dev-aosp12/riscv-android-src$ riscv64-unknown-linux-gnu-objdump -d out/target/product/emulator_riscv64/symbols/data/nativetest64/bionic-unit-tests/bionic-unit-tests | grep -wn hwcap_resolver
233216:00000000002d18e6 <hwcap_resolver>:
relocation type 不正常,而 aosp-riscv 上是好的。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
还有个发现就是现在 aosp 里的 生成的 程序中查符号表 readelf -s
看不到 IFUNC ,我查了 relocation table ,貌似 relocation 项目是存在的,就是 R_RISCV_IRELATIV,或许符号表中的项不是必须的,但我向知道为啥没有,我用 gcc 测试是有的
添加编译的命令和链接的命令供参考:
[3/37] PWD=/proc/self/cwd prebuilts/clang/host/linux-x86/clang-r416183b1/bin/clang++ -c -Werror=implicit-function-declaration -Wno-implicit-int-float-conversion -Wno-deprecated-copy -Wno-implicit-fallthrough -mno-relax -fintegrated-as -Wno-implicit-fallthrough -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Wunreachable-code-loop-increment -no-canonical-prefixes -DNDEBUG -UDEBUG -fno-exceptions -Wno-multichar -O2 -g -fdebug-info-for-profiling -fno-strict-aliasing -Werror=date-time -Werror=pragma-pack -Werror=pragma-pack-suspicious-include -Werror=string-plus-int -Werror=unreachable-code-loop-increment -fdebug-prefix-map=/proc/self/cwd= -D__compiler_offsetof=__builtin_offsetof -faddrsig -fcommon -Werror=int-conversion -fexperimental-new-pass-manager -Wno-reserved-id-macro -Wno-unused-command-line-argument -fcolor-diagnostics -Wno-sign-compare -Wno-defaulted-function-deleted -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-gnu-folding-constant -Wunguarded-availability -D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang -ffunction-sections -fdata-sections -fno-short-enums -funwind-tables -fstack-protector-strong -Wa,--noexecstack -D_FORTIFY_SOURCE=2 -Wstrict-aliasing=2 -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Werror=format-security -nostdlibinc -Wno-enum-compare -Wno-enum-compare-switch -Wno-null-pointer-arithmetic -Wno-null-dereference -Wno-pointer-compare -Wno-xor-used-as-pow -Wno-final-dtor-non-final-class -Wno-psabi -Werror=implicit-function-declaration -Wno-implicit-int-float-conversion -Wno-deprecated-copy -Wno-implicit-fallthrough -mno-relax -fintegrated-as -Wno-implicit-fallthrough -target riscv64-linux-android10000 -Bprebuilts/gcc/linux-x86/riscv64/riscv64-linux-android-8.1/riscv64-linux-android/bin -DANDROID_STRICT -fPIC -Wsign-promo -Wimplicit-fallthrough -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -Wno-gnu-include-next -fvisibility-inlines-hidden -Wno-implicit-int-float-conversion -Wno-deprecated-copy -Wno-implicit-fallthrough -Ibionic/libc -Ibionic/tests -Ibionic/libc/platform -Isystem/core/libcutils/include -Ibionic/libc/async_safe/include -Isystem/logging/liblog/include -Isystem/libprocinfo/include -Ibionic/libc/system_properties/include -Isystem/core/property_service/libpropertyinfoparser/include -Iexternal/googletest/googletest/include -Iexternal/tinyxml2 -Isystem/libbase/include -Iexternal/fmtlib/include -Iexternal/libcxxabi/include -Iexternal/libcxx/include -Iout/soong/.intermediates/bionic/libc/generated_android_ids/gen -isystem bionic/libc/include -isystem bionic/libc/kernel/uapi -isystem bionic/libc/kernel/android/scsi -isystem bionic/libc/kernel/android/uapi -isystem bionic/libc/kernel/uapi/asm-riscv -fstack-protector-all -g -Wall -Wextra -Wunused -Werror -fno-builtin -Wno-deprecated-declarations -Wno-invalid-offsetof -D__STDC_LIMIT_MACROS -DGTEST_HAS_STD_STRING -DGTEST_OS_LINUX_ANDROID -std=gnu++17 -fno-rtti -Isystem/core/include -Isystem/logging/liblog/include -Isystem/media/audio/include -Ihardware/libhardware/include -Ihardware/libhardware_legacy/include -Ihardware/ril/include -Iframeworks/native/include -Iframeworks/native/opengl/include -Iframeworks/av/include -Werror=bool-operation -Werror=implicit-int-float-conversion -Werror=int-in-bool-context -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast -Werror=string-compare -Werror=xor-used-as-pow -Wno-void-pointer-to-enum-cast -Wno-void-pointer-to-int-cast -Wno-pointer-to-int-cast -Werror=fortify-source -Werror=address-of-temporary -Werror=return-type -Wno-tautological-constant-compare -Wno-tautological-type-limit-compare -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-int-in-bool-context -Wno-sizeof-array-div -Wno-tautological-overlap-compare -Wno-deprecated-copy -Wno-range-loop-construct -Wno-misleading-indentation -Wno-zero-as-null-pointer-constant -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-string-compare -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-pessimizing-move -Wno-non-c-typedef-for-linkage -Wno-string-concatenation -MD -MF out/soong/.intermediates/bionic/tests/libBionicStandardTests/android_riscv64_static/obj/bionic/tests/stack_unwinding_test.o.d -o out/soong/.intermediates/bionic/tests/libBionicStandardTests/android_riscv64_static/obj/bionic/tests/stack_unwinding_test.o bionic/tests/stack_unwinding_test.cpp
prebuilts/clang/host/linux-x86/clang-r416183b1/bin/clang++ out/soong/.intermediates/bionic/libc/crtbegin_dynamic/android_riscv64/crtbegin_dynamic.o @out/soong/.intermediates/bionic/tests/bionic-unit-tests/android_riscv64/unstripped/bionic-unit-tests.rsp -Wl,--whole-archive out/soong/.intermediates/bionic/tests/libBionicTests/android_riscv64_static/libBionicTests.a out/soong/.intermediates/bionic/tests/libBionicLoaderTests/android_riscv64_static/libBionicLoaderTests.a out/soong/.intermediates/bionic/tests/libBionicElfTlsLoaderTests/android_riscv64_static/libBionicElfTlsLoaderTests.a -Wl,--no-whole-archive out/soong/.intermediates/system/memory/libmeminfo/libmeminfo/android_riscv64_static/libmeminfo.a out/soong/.intermediates/system/libziparchive/libziparchive/android_riscv64_static/libziparchive.a out/soong/.intermediates/external/zlib/libz/android_riscv64_static/libz.a out/soong/.intermediates/system/core/libutils/libutils/android_riscv64_static/libutils.a out/soong/.intermediates/external/llvm/lib/Object/libLLVMObject/android_riscv64_static/libLLVMObject.a out/soong/.intermediates/external/llvm/lib/Bitcode/Reader/libLLVMBitReader/android_riscv64_static/libLLVMBitReader.a out/soong/.intermediates/external/llvm/lib/MC/libLLVMMC/android_riscv64_static/libLLVMMC.a out/soong/.intermediates/external/llvm/lib/MC/MCParser/libLLVMMCParser/android_riscv64_static/libLLVMMCParser.a out/soong/.intermediates/external/llvm/lib/IR/libLLVMCore/android_riscv64_static/libLLVMCore.a out/soong/.intermediates/external/llvm/lib/Support/libLLVMSupport/android_riscv64_static/libLLVMSupport.a out/soong/.intermediates/external/tinyxml2/libtinyxml2/android_riscv64_static/libtinyxml2.a out/soong/.intermediates/system/libbase/libbase/android_riscv64_static/libbase.a out/soong/.intermediates/system/testing/gtest_extras/libgtest_isolated/android_riscv64_static/libgtest_isolated.a out/soong/.intermediates/system/logging/liblog/liblog/android_riscv64_static/liblog.a out/soong/.intermediates/external/libcxx/libc++_static/android_riscv64_static/libc++_static.a out/soong/.intermediates/external/libcxxabi/libc++demangle/android_riscv64_static/libc++demangle.a -Wl,--start-group prebuilts/clang/host/linux-x86/clang-r416183b1/lib64/clang/12.0.7/lib/linux/libclang_rt.builtins-riscv64-android.a -Wl,--end-group out/soong/.intermediates/bionic/linker/ld-android/android_riscv64_shared/ld-android.so out/soong/.intermediates/bionic/libdl/libdl_android/android_riscv64_shared/libdl_android.so out/soong/.intermediates/bionic/tests/libs/libdl_preempt_test_1/android_riscv64_shared/libdl_preempt_test_1.so out/soong/.intermediates/bionic/tests/libs/libdl_preempt_test_2/android_riscv64_shared/libdl_preempt_test_2.so out/soong/.intermediates/bionic/tests/libs/libdl_test_df_1_global/android_riscv64_shared/libdl_test_df_1_global.so out/soong/.intermediates/bionic/tests/libs/libtest_elftls_shared_var/android_riscv64_shared/libtest_elftls_shared_var.so out/soong/.intermediates/bionic/tests/libs/libtest_elftls_tprel/android_riscv64_shared/libtest_elftls_tprel.so out/soong/.intermediates/bionic/libc/libc/android_riscv64_shared/libc.so out/soong/.intermediates/bionic/libm/libm/android_riscv64_shared/libm.so out/soong/.intermediates/bionic/libdl/libdl/android_riscv64_shared/libdl.so out/soong/.intermediates/bionic/libc/crtend_android/android_riscv64/obj/bionic/libc/arch-common/bionic/crtend.o -o out/soong/.intermediates/bionic/tests/bionic-unit-tests/android_riscv64/unstripped/bionic-unit-tests -target riscv64-linux-android10000 -Bprebuilts/gcc/linux-x86/riscv64/riscv64-linux-android-8.1/riscv64-linux-android/bin -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--build-id=md5 -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined-version -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_stripped.a -Wl,--exclude-libs,libunwind_llvm.a -Wl,--exclude-libs,libunwind.a -Wl,--icf=safe -fuse-ld=lld -Wl,--pack-dyn-relocs=android+relr -Wl,--no-undefined -Wl,--allow-shlib-undefined -Wl,--exclude-libs=libclang_rt.builtins-riscv64-android.a -pie -nostdlib -Bdynamic -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--export-dynamic '-Wl,--rpath,${ORIGIN}/../bionic-loader-test-libs' -Wl,--enable-new-dtags prebuilts/clang/host/linux-x86/clang-r416183b1/lib64/clang/12.0.7/lib/linux/libclang_rt.ubsan_minimal-riscv64-android.a -Wl,--exclude-libs,libclang_rt.ubsan_minimal-riscv64-android.a -Wl,-dynamic-linker,/system/bin/bootstrap/linker64
[28/37] prebuilts/clang/host/linux-x86/clang-r416183b1/bin/clang++ out/soong/.intermediates/bionic/libc/crtbegin_static/android_riscv64/crtbegin_static.o @out/soong/.intermediates/bionic/tests/bionic-unit-tests-static/android_riscv64/unstripped/bionic-unit-tests-static.rsp -Wl,--whole-archive out/soong/.intermediates/bionic/tests/libBionicTests/android_riscv64_static/libBionicTests.a -Wl,--no-whole-archive out/soong/.intermediates/external/tinyxml2/libtinyxml2/android_riscv64_static/libtinyxml2.a out/soong/.intermediates/system/libbase/libbase/android_riscv64_static/libbase.a out/soong/.intermediates/system/core/debuggerd/libdebuggerd_handler/android_riscv64_static/libdebuggerd_handler.a out/soong/.intermediates/system/testing/gtest_extras/libgtest_isolated/android_riscv64_static/libgtest_isolated.a out/soong/.intermediates/system/logging/liblog/liblog/android_riscv64_static/liblog.a out/soong/.intermediates/bionic/tests/libs/libtest_elftls_shared_var/android_riscv64_static/libtest_elftls_shared_var.a out/soong/.intermediates/bionic/tests/libs/libtest_elftls_tprel/android_riscv64_static/libtest_elftls_tprel.a out/soong/.intermediates/external/libcxx/libc++_static/android_riscv64_static/libc++_static.a out/soong/.intermediates/external/libcxxabi/libc++demangle/android_riscv64_static/libc++demangle.a out/soong/.intermediates/bionic/libm/libm/android_riscv64_static/libm.a out/soong/.intermediates/bionic/libc/libc/android_riscv64_static/libc.a out/soong/.intermediates/bionic/libdl/libdl/android_riscv64_static/libdl.a prebuilts/clang/host/linux-x86/clang-r416183b1/lib64/clang/12.0.7/lib/linux/riscv64/libunwind.a -Wl,--start-group out/soong/.intermediates/bionic/libc/libc/android_riscv64_static/libc.a prebuilts/clang/host/linux-x86/clang-r416183b1/lib64/clang/12.0.7/lib/linux/libclang_rt.builtins-riscv64-android.a -Wl,--end-group out/soong/.intermediates/bionic/libc/crtend_android/android_riscv64/obj/bionic/libc/arch-common/bionic/crtend.o -o out/soong/.intermediates/bionic/tests/bionic-unit-tests-static/android_riscv64/unstripped/bionic-unit-tests-static -target riscv64-linux-android10000 -Bprebuilts/gcc/linux-x86/riscv64/riscv64-linux-android-8.1/riscv64-linux-android/bin -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--build-id=md5 -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined-version -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_stripped.a -Wl,--exclude-libs,libunwind_llvm.a -Wl,--exclude-libs,libunwind.a -Wl,--icf=safe -fuse-ld=lld -Wl,--pack-dyn-relocs=android+relr -Wl,--no-undefined -Wl,--allow-shlib-undefined -Wl,--exclude-libs=libclang_rt.builtins-riscv64-android.a -static -nostdlib -Bstatic -Wl,--gc-sections prebuilts/clang/host/linux-x86/clang-r416183b1/lib64/clang/12.0.7/lib/linux/libclang_rt.ubsan_minimal-riscv64-android.a -Wl,--exclude-libs,libclang_rt.ubsan_minimal-riscv64-android.a
首先需要解决的是目前 RVI upstream 的 ld 生成的可执行文件中 relocation Type 为 R_RISCV_NONE
的问题。
目前采用最新的 6.23 更新的 github 仓库生成的 bionic-unit-tests 存在这个问题,导致测试 crash。
$ riscv64-linux-gnu-readelf -r out/target/product/emulator_riscv64/symbols/data/nativetest64/bionic-unit-tests/bionic-unit-tests | grep R_RISCV_NONE
00000074cf08 000000000000 R_RISCV_NONE 2d17c2
00000074cf10 000000000000 R_RISCV_NONE 2d18e6
$ riscv64-linux-gnu-readelf -s out/target/product/emulator_riscv64/symbols/data/nativetest64/bionic-unit-tests/bionic-unit-tests | grep resolver
3945: 00000000002d18e6 54 FUNC GLOBAL DEFAULT 16 hwcap_resolver
16386: 00000000002d17c2 54 FUNC GLOBAL DEFAULT 16 resolver
914860: 00000000002d18e6 54 FUNC GLOBAL DEFAULT 16 hwcap_resolver
914861: 00000000002d17c2 54 FUNC GLOBAL DEFAULT 16 resolver
https://github.com/riscv-android-src/toolchain-llvm-project/blob/riscv-llvm-r416183_dev/lld/ELF/Arch/RISCV.cpp#L79
把处理gnu ifunc的重定向注释掉了, 这行注释导致bionic上关于gnu ifunc的测试fail掉了.
我给 RVI upstream 提了一个issue:https://github.com/riscv-android-src/platform-bionic/issues/33
登录 后才可以发表评论