解决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)

sitemap