使用gcc的-shared和-pie选项时存在的问题和疑问

时间:2018-12-26 08:38:33

标签: gcc shared-libraries executable ld undefined-reference

我想生成一个可以正常执行并且可以由其他文件动态链接的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

所以,我不明白为什么会这样。我找不到任何可以帮助您的信息。我该如何实现自己的目标?可执行且可链接。

0 个答案:

没有答案