unicorn-engine / unicorn

Unicorn CPU emulator framework (ARM, AArch64, M68K, Mips, Sparc, PowerPC, RiscV, S390x, TriCore, X86)
http://www.unicorn-engine.org
GNU General Public License v2.0
7.33k stars 1.31k forks source link

RISC-V Compilation Error #1914

Closed gmoulk closed 6 months ago

gmoulk commented 6 months ago

During compilation on RISC-V CPU running on QEMU system emulation I get the following compilation error while building from sources root@debian:~/unicorn/build# make [ 5%] Built target unicorn-common [ 12%] Built target x86_64-softmmu [ 17%] Built target arm-softmmu [ 23%] Built target aarch64-softmmu [ 28%] Built target m68k-softmmu [ 33%] Built target mips-softmmu [ 38%] Built target mipsel-softmmu [ 43%] Built target mips64-softmmu [ 48%] Built target mips64el-softmmu [ 53%] Built target sparc-softmmu [ 58%] Built target sparc64-softmmu [ 65%] Built target ppc-softmmu [ 72%] Built target ppc64-softmmu [ 76%] Built target riscv32-softmmu [ 81%] Built target riscv64-softmmu [ 87%] Built target s390x-softmmu [ 92%] Built target tricore-softmmu [ 92%] Built target unicorn [ 92%] Built target unicorn_static [ 92%] Built target bundling_target [ 92%] Linking C executable sample_x86 /usr/bin/ld: libunicorn.so.2: undefined reference to helper_atomic_ldo_le_mmu_ppc64' /usr/bin/ld: libunicorn.so.2: undefined reference tohelper_atomic_ldo_be_mmu_ppc64' /usr/bin/ld: libunicorn.so.2: undefined reference to helper_atomic_cmpxchgo_le_mmu_aarch64' /usr/bin/ld: libunicorn.so.2: undefined reference tohelper_atomic_cmpxchgo_be_mmu_aarch64' /usr/bin/ld: libunicorn.so.2: undefined reference to helper_atomic_sto_be_mmu_s390x' /usr/bin/ld: libunicorn.so.2: undefined reference tohelper_atomic_ldo_be_mmu_s390x' /usr/bin/ld: libunicorn.so.2: undefined reference to helper_atomic_cmpxchgo_be_mmu_s390x' /usr/bin/ld: libunicorn.so.2: undefined reference tohelper_atomic_cmpxchgo_be_mmu_ppc64' /usr/bin/ld: libunicorn.so.2: undefined reference to helper_atomic_sto_be_mmu_ppc64' /usr/bin/ld: libunicorn.so.2: undefined reference tohelper_atomic_cmpxchgo_le_mmu_ppc64' /usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_sto_le_mmu_ppc64' collect2: error: ld returned 1 exit status make[2]: [CMakeFiles/sample_x86.dir/build.make:98: sample_x86] Error 1 make[1]: [CMakeFiles/Makefile2:727: CMakeFiles/sample_x86.dir/all] Error 2 make: *** [Makefile:146: all] Error 2

patryk4815 commented 6 months ago

@gmoulk we solved this in nixpkgs https://github.com/NixOS/nixpkgs/pull/275084 by adding "-latomic"

More info: https://github.com/unicorn-engine/unicorn/issues/1840#issuecomment-1859256464

patryk4815 commented 6 months ago

@gmoulk Can you share, how did you compile it, command? Looks like it should work on "2.0.1" tag.

gmoulk commented 6 months ago

I just followed the instructions for compilation https://github.com/unicorn-engine/unicorn/blob/master/docs/COMPILE.md on the GitHub page of unicorn

mkdir build; cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make

But i managed to compile it by excluding the architectures I didn't want to use.

patryk4815 commented 6 months ago

@gmoulk try with -DCMAKE_BUILD_TYPE=Debug looks like -DCMAKE_BUILD_TYPE=Release is broken, and only Debug works

wtdcode commented 6 months ago

I confirmed that the observation from @patryk4815 is correct and the release build is broken on RISCV64. Investigating the correct place to add -latomic.

wtdcode commented 6 months ago

Pushed a fix to dev and confirmed that it now builds, closing.

patryk4815 commented 6 months ago

@wtdcode tested commit: f389666ea6eb653f040094ef9c7ee05479e23671

unicorn-riscv64-unknown-linux-gnu> FAILED: sample_x86
unicorn-riscv64-unknown-linux-gnu> : && /nix/store/qgc74hfp0kinrr7cpkz30w109qq7raij-riscv64-unknown-linux-gnu-gcc-wrapper-12.3.0/bin/riscv64-unknown-linux-gnu-gcc -O3 -DNDEBUG -rdynamic CMak
eFiles/sample_x86.dir/samples/sample_x86.c.o -o sample_x86  -Wl,-rpath,/build/source/build  libunicorn.so.2  -lpthread  -lm && :
unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_ldo_le_mmu_ppc64'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_ldo_be_mmu_ppc64'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_le_mmu_aarch64'                                                                                                                                                    unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_be_mmu_aarch64'                                                                                                                                                    unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_sto_be_mmu_s390x'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_ldo_be_mmu_s390x'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_be_mmu_s390x'                                                                                                                                                      unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_be_mmu_ppc64'                                                                                                                                                      unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_sto_be_mmu_ppc64'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_le_mmu_ppc64'                                                                                                                                                      unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_sto_le_mmu_ppc64'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> collect2: error: ld returned 1 exit status
unicorn-riscv64-unknown-linux-gnu> [637/663] Linking C executable sample_mips                                                                                                                 unicorn-riscv64-unknown-linux-gnu> FAILED: sample_mips

Build Fail

wtdcode commented 6 months ago

Oh wait, I'm too eager, it just fails a bit later.

@patryk4815 Looks like -latomic fixes for cross-compilation cases but not natively building.

wtdcode commented 6 months ago

@wtdcode tested commit: f389666ea6eb653f040094ef9c7ee05479e23671

unicorn-riscv64-unknown-linux-gnu> FAILED: sample_x86
unicorn-riscv64-unknown-linux-gnu> : && /nix/store/qgc74hfp0kinrr7cpkz30w109qq7raij-riscv64-unknown-linux-gnu-gcc-wrapper-12.3.0/bin/riscv64-unknown-linux-gnu-gcc -O3 -DNDEBUG -rdynamic CMak
eFiles/sample_x86.dir/samples/sample_x86.c.o -o sample_x86  -Wl,-rpath,/build/source/build  libunicorn.so.2  -lpthread  -lm && :
unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_ldo_le_mmu_ppc64'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_ldo_be_mmu_ppc64'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_le_mmu_aarch64'                                                                                                                                                    unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_be_mmu_aarch64'                                                                                                                                                    unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_sto_be_mmu_s390x'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_ldo_be_mmu_s390x'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_be_mmu_s390x'                                                                                                                                                      unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_be_mmu_ppc64'                                                                                                                                                      unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_sto_be_mmu_ppc64'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_cmpxchgo_le_mmu_ppc64'                                                                                                                                                      unicorn-riscv64-unknown-linux-gnu> /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld: libunicorn.so.2: undefined reference
to `helper_atomic_sto_le_mmu_ppc64'                                                                                                                                                           unicorn-riscv64-unknown-linux-gnu> collect2: error: ld returned 1 exit status
unicorn-riscv64-unknown-linux-gnu> [637/663] Linking C executable sample_mips                                                                                                                 unicorn-riscv64-unknown-linux-gnu> FAILED: sample_mips

Build Fail

Yes, I just want to hint you about this.

patryk4815 commented 6 months ago

@wtdcode btw my build/failed messages was for cross compilation

wtdcode commented 6 months ago

That's weird, maybe -latomic should be added to linker instead of compiler? I can't see the actual difference but I will have a try.

wtdcode commented 6 months ago

I got it. The flag was lacking when building executables.

wtdcode commented 6 months ago

This shall work now, waiting for my building locally.

wtdcode commented 6 months ago

Will fix it later, and it should also be reflected in pkg-config installed on these systems.

wtdcode commented 6 months ago
debian@debian-bullseye-riscv64:~/unicorn/build_release$ /usr/bin/cc -O3 -DNDEBUG -rdynamic CMakeFiles/test_arm.dir/tests/unit/test_arm.c.o -o test_arm  -Wl,-rpath,/home/debian/unicorn/build_release  libunicorn.so.2 -latomic -lpthread -Wl,-latomic
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_ldo_le_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_ldo_be_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_le_mmu_aarch64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_be_mmu_aarch64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_sto_be_mmu_s390x'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_ldo_be_mmu_s390x'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_be_mmu_s390x'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_be_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_sto_be_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_le_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_sto_le_mmu_ppc64'
collect2: error: ld returned 1 exit status
debian@debian-bullseye-riscv64:~/unicorn/build_release$ /usr/bin/cc -O3 -DNDEBUG -rdynamic CMakeFiles/test_arm.dir/tests/unit/test_arm.c.o -o test_arm  -Wl,-rpath,/home/debian/unicorn/build_release  libunicorn.so.2 -latomic -lpthread -latomic
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_ldo_le_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_ldo_be_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_le_mmu_aarch64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_be_mmu_aarch64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_sto_be_mmu_s390x'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_ldo_be_mmu_s390x'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_be_mmu_s390x'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_be_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_sto_be_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_cmpxchgo_le_mmu_ppc64'
/usr/bin/ld: libunicorn.so.2: undefined reference to `helper_atomic_sto_le_mmu_ppc64'
collect2: error: ld returned 1 exit status

@patryk4815 even adding -latomic doesn't solve the problem, I suspect it's a bug indeed and needs further investigation. How does cross-compilation works with nix? Could you give the command line it uses to build test_*?

patryk4815 commented 6 months ago

@wtdcode maybe this help, i will try provide better log if needed.

[658/663] Linking C executable test_ppc
HARDENING: disabled flags: pie fortify
HARDENING: Is active (not completely disabled with "all" flag)
HARDENING: enabling pic
HARDENING: enabling fortify3
HARDENING: enabling format
HARDENING: enabling stackprotector
HARDENING: enabling strictoverflow
extra flags before to /nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/bin/riscv64-unknown-linux-gnu-gcc:
  -fPIC
  -O2
  -U_FORTIFY_SOURCE
  -Wformat
  -Wformat-security
  -Werror=format-security
  -fstack-protector-strong
  --param
  ssp-buffer-size=4
  -fno-strict-overflow
  -Wl\,-dynamic-linker=/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/ld-linux-riscv64-lp64d.so.1
original flags to /nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/bin/riscv64-unknown-linux-gnu-gcc:
  -O3
  -DNDEBUG
  -rdynamic
  CMakeFiles/test_ppc.dir/tests/unit/test_ppc.c.o
  -o
  test_ppc
  -Wl\,-rpath\,/build/source/build
  libunicorn.so.2
  -lpthread
  -lm
extra flags after to /nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/bin/riscv64-unknown-linux-gnu-gcc:
  -U_FORTIFY_SOURCE
  -D_FORTIFY_SOURCE=3
  -B/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/
  -idirafter
  /nix/store/i95iiihnkvwa4dn5wyxngnhfgxwb7r0p-glibc-riscv64-unknown-linux-gnu-2.38-27-dev/include
  -idirafter
  /nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/lib/gcc/riscv64-unknown-linux-gnu/12.3.0/include-fixed
  -B/nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib
  -B/nix/store/qgc74hfp0kinrr7cpkz30w109qq7raij-riscv64-unknown-linux-gnu-gcc-wrapper-12.3.0/bin/
  -frandom-seed=s6d9jlbs16
  -Wl\,-rpath
  -Wl\,/nix/store/s6d9jlbs16dyq1nm4cxin0figip41yms-unicorn-riscv64-unknown-linux-gnu-2.0.1.post1-dev2/lib
  -Wl\,-latomic
  -L/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib
  -L/nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib
skipping impure path /lib/ld-linux-riscv64-lp64d.so.1
HARDENING: disabled flags: pie
HARDENING: Is active (not completely disabled with "all" flag)
HARDENING: enabling relro
HARDENING: enabling bindnow
extra flags before to /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld:
  -z
  relro
  -z
  now
original flags to /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld:
  -plugin
  /nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/libexec/gcc/riscv64-unknown-linux-gnu/12.3.0/liblto_plugin.so
  -plugin-opt=/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/libexec/gcc/riscv64-unknown-linux-gnu/12.3.0/lto-wrapper
  -plugin-opt=-fresolution=/build/ccsEkHE8.res
  -plugin-opt=-pass-through=-lgcc
  -plugin-opt=-pass-through=-lgcc_s
  -plugin-opt=-pass-through=-lc
  -plugin-opt=-pass-through=-lgcc
  -plugin-opt=-pass-through=-lgcc_s
  --eh-frame-hdr
  -melf64lriscv
  -export-dynamic
  -o
  test_ppc
  /nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/crt1.o
  /nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/crti.o
  /nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/lib/gcc/riscv64-unknown-linux-gnu/12.3.0/crtbegin.o
  -L/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib
  -L/nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib
  -L/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib
  -L/nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib
  -L/nix/store/qgc74hfp0kinrr7cpkz30w109qq7raij-riscv64-unknown-linux-gnu-gcc-wrapper-12.3.0/bin
  -L/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/lib/gcc/riscv64-unknown-linux-gnu/12.3.0
  -L/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/lib/gcc/riscv64-unknown-linux-gnu/12.3.0/../../../../riscv64-unknown-linux-gnu/lib
  -dynamic-linker=/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/ld-linux-riscv64-lp64d.so.1
  CMakeFiles/test_ppc.dir/tests/unit/test_ppc.c.o
  -rpath
  /build/source/build
  libunicorn.so.2
  -lpthread
  -lm
  -rpath
  /nix/store/s6d9jlbs16dyq1nm4cxin0figip41yms-unicorn-riscv64-unknown-linux-gnu-2.0.1.post1-dev2/lib
  -latomic
  -lgcc
  --push-state
  --as-needed
  -lgcc_s
  --pop-state
  -lc
  -lgcc
  --push-state
  --as-needed
  -lgcc_s
  --pop-state
  /nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/lib/gcc/riscv64-unknown-linux-gnu/12.3.0/crtend.o
  /nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/crtn.o
extra flags after to /nix/store/p5fb9bhsm2mxvw04cr31cx8imihn851f-riscv64-unknown-linux-gnu-binutils-2.40/bin/riscv64-unknown-linux-gnu-ld:
  -rpath
  /nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib
  -rpath
  /nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib
patryk4815 commented 6 months ago
[pid 112884] execve("/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/bin/riscv64-unknown-linux-gnu-gcc", ["/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/bin/riscv64-unknown-linux-gnu-gcc", "-fPIC", "-O2", "-U_FORTIFY_SOURCE", "-Wformat", "-Wformat-security", "-Werror=format-security", "-fstack-protector-strong", "--param", "ssp-buffer-size=4", "-fno-strict-overflow", "-Wl,-dynamic-linker=/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/ld-linux-riscv64-lp64d.so.1", "-O3", "-DNDEBUG", "-rdynamic", "CMakeFiles/test_mem.dir/tests/unit/test_mem.c.o", "-o", "test_mem", "-Wl,-rpath,/build/source/build", "libunicorn.so.2", "-lpthread", "-lm", "-U_FORTIFY_SOURCE", "-D_FORTIFY_SOURCE=3", "-B/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/", "-idirafter", "/nix/store/i95iiihnkvwa4dn5wyxngnhfgxwb7r0p-glibc-riscv64-unknown-linux-gnu-2.38-27-dev/include", "-idirafter", "/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/lib/gcc/riscv64-unknown-linux-gnu/12.3.0/include-fixed", "-B/nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib", "-B/nix/store/qgc74hfp0kinrr7cpkz30w109qq7raij-riscv64-unknown-linux-gnu-gcc-wrapper-12.3.0/bin/", "-frandom-seed=87zhzncfy4", "-Wl,-rpath", "-Wl,/nix/store/87zhzncfy4k3lxqf2z33k97sdcnv04y4-unicorn-riscv64-unknown-linux-gnu-2.0.1.post1-dev2/lib", "-Wl,-latomic", "-L/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib", "-L/nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib"], 0x4f4320 /* 99 vars */) = 0

there is "-Wl,-latomic"

wtdcode commented 6 months ago
[pid 112884] execve("/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/bin/riscv64-unknown-linux-gnu-gcc", ["/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/bin/riscv64-unknown-linux-gnu-gcc", "-fPIC", "-O2", "-U_FORTIFY_SOURCE", "-Wformat", "-Wformat-security", "-Werror=format-security", "-fstack-protector-strong", "--param", "ssp-buffer-size=4", "-fno-strict-overflow", "-Wl,-dynamic-linker=/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/ld-linux-riscv64-lp64d.so.1", "-O3", "-DNDEBUG", "-rdynamic", "CMakeFiles/test_mem.dir/tests/unit/test_mem.c.o", "-o", "test_mem", "-Wl,-rpath,/build/source/build", "libunicorn.so.2", "-lpthread", "-lm", "-U_FORTIFY_SOURCE", "-D_FORTIFY_SOURCE=3", "-B/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib/", "-idirafter", "/nix/store/i95iiihnkvwa4dn5wyxngnhfgxwb7r0p-glibc-riscv64-unknown-linux-gnu-2.38-27-dev/include", "-idirafter", "/nix/store/mxm0c62lhwvxy04pafciwx9f07hqgp91-riscv64-unknown-linux-gnu-gcc-12.3.0/lib/gcc/riscv64-unknown-linux-gnu/12.3.0/include-fixed", "-B/nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib", "-B/nix/store/qgc74hfp0kinrr7cpkz30w109qq7raij-riscv64-unknown-linux-gnu-gcc-wrapper-12.3.0/bin/", "-frandom-seed=87zhzncfy4", "-Wl,-rpath", "-Wl,/nix/store/87zhzncfy4k3lxqf2z33k97sdcnv04y4-unicorn-riscv64-unknown-linux-gnu-2.0.1.post1-dev2/lib", "-Wl,-latomic", "-L/nix/store/8az088dyh7w7kmacnw3r34i6gwnc1pb5-glibc-riscv64-unknown-linux-gnu-2.38-27/lib", "-L/nix/store/daiz8w8508591g1jl8jpdk9zjynm7b8c-riscv64-unknown-linux-gnu-gcc-12.3.0-lib/riscv64-unknown-linux-gnu/lib"], 0x4f4320 /* 99 vars */) = 0

there is "-Wl,-latomic"

Mine is gcc (Debian 13.2.0-9) 13.2.0 btw. Not sure if this makes a difference.

wtdcode commented 6 months ago

@patryk4815 Could you confirm if current version works for your cross-compilation workflow? I should add -latomic to appropriate locations, though I'm still experiencing building failure.

btw, could you give the output of objdump --syms libunicorn.so.2 | grep helper_atomic_ldo_le_mmu_ppc64?

patryk4815 commented 6 months ago

@wtdcode tested on e5fa037aebd9c74355200aec8a0cc77f2a15675e. Build fails.

objdump --syms:

0000000000000000         *UND*  0000000000000000              helper_atomic_ldo_le_mmu_ppc64

Btw. why CMAKE_BUILD_TYPE=Debug works fine?

wtdcode commented 6 months ago

@wtdcode tested on e5fa037aebd9c74355200aec8a0cc77f2a15675e. Build fails.

objdump --syms:

0000000000000000         *UND*  0000000000000000              helper_atomic_ldo_le_mmu_ppc64

What does objdump give with the successful builds containing your fix?

patryk4815 commented 6 months ago

@wtdcode I misunderstood

e5fa037aebd9c74355200aec8a0cc77f2a15675e without my fix:

0000000000000000         *UND*  0000000000000000              helper_atomic_ldo_le_mmu_ppc64

Debug:

$ objdump --syms ./libunicorn.so.2 | grep 'helper_atomic_ldo_le_mmu_ppc64'
(empty/nothing)

Release with my fix with -latomic

$ objdump --syms ./libunicorn.so.2 | grep 'helper_atomic_ldo_le_mmu_ppc64'
0000000000b9edb4 g     F .text  0000000000000016              helper_atomic_ldo_le_mmu_ppc64
wtdcode commented 6 months ago

That's the point, so the symbol is not correctly linked. I have to check it in detail.

wtdcode commented 6 months ago

Confirm fixed now. I forget to tell configure the correct flag.

debian@debian-bullseye-riscv64:~/unicorn/build_release$ ./test_mem
Test test_map_correct...                        [ OK ]
Test test_map_wrapping...                       [ OK ]
Test test_mem_protect...                        [ OK ]
Test test_splitting_mem_unmap...                [ OK ]
Test test_splitting_mmio_unmap...               [ OK ]
Test test_mem_protect_map_ptr...                [ OK ]
Test test_map_at_the_end...                     [ OK ]
Test test_map_wrap...                           [ OK ]
Test test_map_big_memory...                     [ OK ]
Test test_mem_protect_remove_exec...            [ OK ]
Test test_mem_protect_mmio...                   [ OK ]
Test test_snapshot...                           [ OK ]
Test test_snapshot_with_vtlb...                 [ OK ]
Test test_context_snapshot...                   [ OK ]
Test test_snapshot_unmap...                     [ OK ]
SUCCESS: All unit tests have passed.
debian@debian-bullseye-riscv64:~/unicorn/build_release$ cat CMakeCache.txt | grep CMAKE_BUILD_TYPE
CMAKE_BUILD_TYPE:STRING=Release
debian@debian-bullseye-riscv64:~/unicorn/build_release$ uname -a
Linux debian-bullseye-riscv64 6.6.8-riscv64 #1 SMP Debian 6.6.8-1 (2023-12-22) riscv64 GNU/Linux
debian@debian-bullseye-riscv64:~/unicorn/build_release$
wtdcode commented 6 months ago

@patryk4815 @gmoulk Could you check if this works? If so we can close the issue.

patryk4815 commented 6 months ago

@wtdcode 04064072137649baa8c7d0de140509456b74b8fb success for riscv ;)

riscv64 success:

$ objdump --syms ./libunicorn.so.2 | grep 'helper_atomic_ldo_le_mmu_ppc64'
0000000000b9edb4 g     F .text  0000000000000016              helper_atomic_ldo_le_mmu_ppc64

armv7l (arm32) fail:

$ objdump --syms ./libunicorn.so.2 | grep helper_atomic_ldo_le_mmu_ppc64
00000000         *UND*  00000000              helper_atomic_ldo_le_mmu_ppc64

^ maybe we need disable at all atomic there? (-latomic for arm32 not working, maybe there is something other)

wtdcode commented 6 months ago

Closing as I tested it indeed works.