用-fPIC重新编译

时间:2019-02-28 20:05:30

标签: fpic

我写这个命令:

gcc drr.c -o drr -pthread -lcdsl -L./../synch_implementations -I./../synch_implementations

我不明白为什么收到此回复:

usr/bin/ld: ./../synch_implementations/libcdsl.a(cdsl_queue_list.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIC
usr/bin/ld: ./../synch_implementations/libcdsl.a(cdsl_deque_list.o): relocation R_X86_64_32S against symbol `cdsl_deque_list_lock_based_pthread_push_tail' can not be used when making a PIE object; recompile with -fPIC
usr/bin/ld: ./../synch_implementations/libcdsl.a(cdsl_lock.o): relocation R_X86_64_32S against symbol `cdsl_pthread_lock_request' can not be used when making a PIE object; recompile with -fPIC
usr/bin/ld: final link failed: Nonrepresentable section on output
ollect2: error: ld returned 1 exit status

谁能帮助我了解问题所在?

注意:

1)我使用ubuntu(通过VirtualBox)。

2)我经验不足,所以这可能不是一个很聪明的问题。

1 个答案:

答案 0 :(得分:0)

解决方案: 当您编译./../synch_implementations/libcdsl.a时,您需要添加一个额外的“ -fPIC”标志来生成与位置无关的代码(请参见上面的注释)。

注意: 通常,在生成库对象代码时需要使用PIC标志,因为它会创建相对于全局偏移表(GOT)的对象,该全局偏移表随后可将库对象与您的代码链接。