Ximin Luo: > Adrian Bunk: >> ... testing 'quicksort2':/usr/bin/ld: quicksort2.o: relocation >> R_ARM_THM_MOVW_ABS_NC against `cmp' can not be used when making a shared >> object; recompile with -fPIC >> quicksort2.o: error adding symbols: Bad value >> collect2: error: ld returned 1 exit status >> => failed >> ... testing 'soli':/usr/bin/ld: soli.o: relocation R_ARM_THM_MOVW_ABS_NC >> against `a local symbol' can not be used when making a shared object; >> recompile with -fPIC >> soli.o: error adding symbols: Bad value >> collect2: error: ld returned 1 exit status >> => failed >> ... testing 'arith':/usr/bin/ld: arith.o: relocation R_ARM_THM_MOVW_ABS_NC >> against `D' can not be used when making a shared object; recompile with -fPIC >> arith.o: error adding symbols: Bad value >> collect2: error: ld returned 1 exit status >> => failed >> ... testing 'tagged-integr':/usr/bin/ld: tagged-integr.o: relocation >> R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a >> shared object; recompile with -fPIC >> tagged-integr.o: error adding symbols: Bad value >> collect2: error: ld returned 1 exit status >> => failed >> >> Several other testcases are building fine. >> >> The odd thing is that these worked on armel and arm64 but failed on armhf. >> >> Note that the "recompile with -fPIC" error message can be misleading. >> It is also given when building binaries where only PIE is required >> (which is the default in the gcc used). >> > > It's possible OCaml itself is to blame: > > asmcomp/arm/emit.mlp: > if nh = 0l then begin > ` movw {emit_reg dst}, #{emit_int32 nl}\n`; 1 > end else if Int32.logand nl 0xffl = nl then begin > ` movs {emit_reg dst}, #{emit_int32 nl}\n`; > ` movt {emit_reg dst}, #{emit_int32 nh}\n`; 2 > end else begin > ` movw {emit_reg dst}, #{emit_int32 nl}\n`; > ` movt {emit_reg dst}, #{emit_int32 nh}\n`; 2 > end > > Judging by http://lists.denx.de/pipermail/u-boot/2013-September/163154.html > this might be invalid for ARM and PIC. > > (sid_armhf-dchroot)infinity0@harris:~/ocaml/testsuite/tests/asmcomp$ rm > quicksort2.s quicksort2.o > > (sid_armhf-dchroot)infinity0@harris:~/ocaml/testsuite/tests/asmcomp$ make > CASES=quicksort2 MLCASES= MLCASES_FLAMBDA= > make[1]: Entering directory '/home/infinity0/ocaml/testsuite/tests/asmcomp' > make[2]: Entering directory '/home/infinity0/ocaml/testsuite/tests/asmcomp' > make[2]: Nothing to be done for 'arch'. > make[2]: 'codegen' is up to date. > make[2]: Leaving directory '/home/infinity0/ocaml/testsuite/tests/asmcomp' > make[2]: Entering directory '/home/infinity0/ocaml/testsuite/tests/asmcomp' > ... testing 'quicksort2':make[3]: Entering directory > '/home/infinity0/ocaml/testsuite/tests/asmcomp' > /usr/bin/ld: quicksort2.o: relocation R_ARM_THM_MOVW_ABS_NC against `cmp' can > not be used when making a shared object; recompile with -fPIC > quicksort2.o: error adding symbols: Bad value > collect2: error: ld returned 1 exit status > => failed > make[3]: Leaving directory '/home/infinity0/ocaml/testsuite/tests/asmcomp' > make[2]: Leaving directory '/home/infinity0/ocaml/testsuite/tests/asmcomp' > make[1]: Leaving directory '/home/infinity0/ocaml/testsuite/tests/asmcomp' > > (sid_armhf-dchroot)infinity0@harris:~/ocaml/testsuite/tests/asmcomp$ grep -n > mov[tw] quicksort2.s > 138: movw r3, #:lower16:cmp > 139: movt r3, #:upper16:cmp > > Could someone else more familiar with ARM and/or OCaml comment please? >
And in fact manually editing quicksort2.s to change the movt/w expressions to "r3, 0", commenting out the "codegen" part of the .cmm.o rule in Makefile.common, then running the above test command again, will make it pass. So the emitted instructions are likely what's at fault, but I don't know ARM well enough to suggest how to fix it properly. X -- GPG: ed25519/56034877E1F87C35 GPG: rsa4096/1318EFAC5FBBDBCE https://github.com/infinity0/pubkeys.git