14 Star 80 Fork 38

aosp-riscv / working-group

 / 详情

ifunc crash 问题

已完成
拥有者
创建于  
2022-06-23 09:54

这两个 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)

评论 (5)

unicornx 创建了任务

发现 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 
unicornx 负责人设置为unicornx

首先需要解决的是目前 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
unicornx 添加协作者unicornx
unicornx 负责人unicornx 修改为陆旭凡
unicornx 取消协作者unicornx

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

unicornx 任务状态待办的 修改为已完成
unicornx 任务状态已完成 修改为待办的
unicornx 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
136976 unicornx 1674787217
1
https://gitee.com/aosp-riscv/working-group.git
git@gitee.com:aosp-riscv/working-group.git
aosp-riscv
working-group
working-group

搜索帮助