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

How to use -fPIC and -fPIE GCC options correctly

我有这样的目录结构

dir1
    one.c
    two.c
dir2
    three_main.c
    four.c

我需要在 dir1
中的所有 c 文件中创建一个共享库 libdir1.so dir2 中所有 c 文件中的可执行文件 my_exe 以及 libdir1.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

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

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

谢谢

Should I use -fPIC and -fPIE in step1 or step2 or in both?

没有。您当前构建 .so 和二进制文件的方式是正确的/最佳的。

Can I use -fPIE in step2 in creating the .so file?

你可以,但你不应该:-fPIE 是一个 compile-time 选项,你只是 link 在步骤 2 中。如果将 -fPIE 传递给 link,它将被忽略。

Can I use -fPIC in step1 in creating the executable?

您可以,但这会在可执行文件中创建 sub-optimal 代码。

How can I use RELRO compiler option in creating both .so and executable?

添加-Wl,-z,relro.

should I be using -z,now along with -Wl,-z,relro to be effective?

是的:为了最大限度地强化,你应该这样做。没有 -z,now-Wl,-z,relro 不是 无效 ,而是 较少 有效。 Details.

can I use relro for both binary and .so?

是的。