Har*_*ddy 8 c gcc compilation elf
我有这样的目录结构
dir1
one.c
two.c
dir2
three_main.c
four.c
Run Code Online (Sandbox Code Playgroud)
我需要libdir1.so从所有c文件中创建一个共享库,并从所有c文件中dir1
创建一个可执行文件以及my_exedir2libdir1.so
我分两步创建.so和可执行文件。
.so step1: gcc -c -fPIC -g -O2 -pthread -o one.o one.c
gcc -c -fPIC -g -O2 -pthread -o two.o two.c
.so step2: gcc -shared -g -O2 -pthread -o libdir1.so one.o two.o
exe step1: gcc -c -fPIE -o three_main.o three_main.c
gcc -c -fPIE -o four.o four.c
exe step2: gcc -Wall -g -L -ldir1 -o my_exe three_main.o four.o
Run Code Online (Sandbox Code Playgroud)
现在我的问题是......
step1step2step2step1谢谢
我应该在步骤 1 或步骤 2 或两者中使用 -fPIC 和 -fPIE?
不。您当前构建二进制文件的方式.so是正确/最佳的。
我可以在步骤2中使用-fPIE创建.so文件吗?
你可以,但你不应该:-fPIE是一个编译时选项,并且你只在步骤2中链接。如果您传递-fPIE到链接,它将被忽略。
我可以在创建可执行文件的步骤 1 中使用 -fPIC 吗?
您可以,但这会在可执行文件中创建次优代码。
如何使用 RELRO 编译器选项来创建 .so 和可执行文件?
添加-Wl,-z,relro。
我应该使用 -z,now 和 -Wl,-z,relro 才能有效吗?
是的:为了最大限度地强化,你应该这样做。-Wl,-z,relrowithout-z,now并不是没有效果,而是效果较差。细节。
我可以对二进制文件和 .so 使用 relro 吗?
是的。