我想生成一个可以正常执行并且可以由其他文件动态链接的PIE文件,因此我使用了gcc的-fPIE
,-shared
和-pie
选项。但是我遇到一些问题。我有3个文件,如下所示:
$ cat add.c
int add(int a, int b)
{
return a + b;
}
int main()
{
return 0;
}
$ cat add.h
int add(int a, int b);
$ cat main.c
#include <stdio.h>
#include "add.h"
int main()
{
printf("Result of add(1, 2): %d\n", add(1, 2));
return 0;
}
然后我通过以下命令生成libadd.so
:
gcc -fPIE -pie -shared -o libadd.so add.c
并运行它:
$ ./libadd.so
Segmentation fault (core dumped)
尽管不能正常执行,但可以动态链接:
gcc -L. -ladd -o main main.c
运行它:
$ LD_LIBRARY_PATH=. ./main
Result of add(1, 2): 3
但是,如果我更改选项-pie
和-shared
的顺序,情况就变了。
通过以下命令生成libadd.so
:
gcc -fPIE -shared -pie -o libadd.so add.c
并运行它:
$ ./libadd.so
因为主功能没有任何操作,所以没有打印。但是当我要链接它时,它不起作用:
$ gcc -L. -ladd -o main main.c
/tmp/ccpimuON.o: In function `main':
main.c:(.text+0xf): undefined reference to `add'
collect2: error: ld returned 1 exit status
所以,我不明白为什么会这样。我找不到任何可以帮助您的信息。我该如何实现自己的目标?可执行且可链接。