【发布时间】:2018-11-29 10:50:38
【问题描述】:
基本上,我已经发布了一些关于我的问题的问题。但是,我确实认为这是一个不同的问题。
简单地说,Go 工具具有一组特定的构建模式选项,可以创建一个非 PIC .o 文件(例如 app.o)和一个 PIC 共享库,例如 libmain.so。顾名思义,libmain.so 里面确实有主函数。
随后,Go 工具调用编译器驱动程序 gcc 来链接 .o 和 .so 以生成可执行文件,这不一定是 PIE。为简化起见,Go 工具调用的链接器命令如下:
$ gcc -o app.x -L. -lmain -Wl,-rpath=$PWD -fuse-ld=gold app.o
事情是这样的。至少三位专家确认必须使用 Scrt1.o 来链接它们,因为 main 位于 PIC 共享库中。但是,gcc 正在拉出 crt1.o。
我的问题是这是 gcc 错误还是用户的错。当然,如果用户在上面的链接命令中添加了“-pie”选项,gcc 将使用 Scrt1.o 代替。但是,用户可能会声称,由于他们可能不想要与位置无关的可执行文件,因此添加“-pie”可能没有多大意义。
我试图在 gcc 手册中找到适当的信息,但没有成功。在这种情况下,用户是否应该指定“-pie”?或者,是否允许用户制作非 PIE 可执行文件,以便此问题成为 gcc 错误?
为方便起见,这里举个简单的例子:
$ cat app.c
int foo(int x, int y)
{
volatile int z = x;
return z + y;
}
$ cat main.c
extern int foo(int, int);
int main(int argc, char* argv[])
{
return foo(argc, 4);
}
$ gcc -o app.o -c app.c
$ gcc -o main.o -c -fPIC main.c
$ gcc -o libmain.so -shared main.o
$ gcc -o app.x -L. -lmain -fuse-ld=gold -Wl,-v,-rpath=$PWD app.o
collect2 version 4.8.5 20150623 (Red Hat 4.8.5-36.0.2)
/usr/bin/ld.gold --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -dynamic-linker /lib/ld-linux-aarch64.so.1 -X -o app.x /usr/lib/gcc/aarch64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/aarch64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/aarch64-redhat-linux/4.8.5/crtbegin.o -L. -L/usr/lib/gcc/aarch64-redhat-linux/4.8.5 -L/usr/lib/gcc/aarch64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/aarch64-redhat-linux/4.8.5/../../.. -lmain -v -rpath=/home/aion1223/workspace/shared app.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/aarch64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/aarch64-redhat-linux/4.8.5/../../../../lib64/crtn.o
GNU gold (version 2.27-34.base.0.2.el7) 1.12
【问题讨论】: