如何正确使用 -fPIC 和 -fPIE GCC 选项

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)

现在我的问题是......

  1. 我应该在一个或两个中使用-fPIC-fPIE吗?step1step2
  2. 我可以在创建.so文件时使用-fPIE吗?step2
  3. 我可以在创建可执行文件时使用-fPIC吗?step1
  4. 如何使用RELRO编译器选项来创建.so可执行文件

谢谢

Emp*_*ian 7

我应该在步骤 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 吗?

是的。