解决requires unsupported dynamic reloc R_ARM_MOVW_ABS_NC; recompile with -fPIC
/home/lid/gcc/sdk8053/sysroots/x86_64-oesdk-linux/usr/libexec/arm-oe-linux-gnueabi/gcc/arm-oe-linux-gnueabi/4.9.3/real-ld: error: test/camera_test.o: requires unsupported dynamic reloc R_ARM_MOVW_ABS_NC; recompile with -fPIC
/home/lid/gcc/sdk8053/sysroots/x86_64-oesdk-linux/usr/libexec/arm-oe-linux-gnueabi/gcc/arm-oe-linux-gnueabi/4.9.3/real-ld: error: test/camera_test.o: requires unsupported dynamic reloc R_ARM_MOVW_ABS_NC; recompile with -fPIC
/home/lid/gcc/sdk8053/sysroots/x86_64-oesdk-linux/usr/libexec/arm-oe-linux-gnueabi/gcc/arm-oe-linux-gnueabi/4.9.3/real-ld: error: test/camera_test.o: requires unsupported dynamic reloc R_ARM_MOVW_ABS_NC; recompile with -fPIC
/home/lid/gcc/sdk8053/sysroots/x86_64-oesdk-linux/usr/libexec/arm-oe-linux-gnueabi/gcc/arm-oe-linux-gnueabi/4.9.3/real-ld: error: test/camera_test.o: requires unsupported dynamic reloc R_ARM_MOVW_ABS_NC; recompile with -fPIC
应该是要求动态分配地址的指令不支持。
调试高通camera 利用hal1层的api编译程序的时候,发现上述问题,我在Makefile里边的确也调用了 -fpic,但依旧提示这个问题。
后来以为是arm_MOVW_ABS_NC这个指令不能在armv7a上使用,打算放弃,后来研究-fpic是怎么回事。
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
fix build by adding -fPIC to CFLAGS
另外将 -fpic加在CFLAGS 上不要加在 LDFLAG
如下
CFLAGS += -I./src/camera_hal1
CFLAGS += -I./inc
CFLAGS += -I./src/common -I./libstagefrighthw
CFLAGS += -fPIC
结果证明 在开发板上执行出现
/data/misc/camera # ./camera-service
Illegal instruction (core dumped)