GCC创建共享对象而不是可执行二进制文件

我有一个正在建设的图书馆。 当我运行以下任何一个时,我的所有对象都会连续编译和链接: ar rcs lib/libryftts.a $^

gcc -shared $^ -o lib/libryftts.so

在我的Makefile中。 我也能够成功地将它们安装到/usr/local/lib当我用nm测试文件时,所有的function都在那里。 我的问题是当我运行gcc testing/test.c -lryftts -o test && file ./testgcc testing/test.c lib/libryftts.a -o test && file ./test时说:

test: ELF 64-bit LSB shared object而不是test: ELF 64-bit LSB executable正如我所料。 我究竟做错了什么?

我究竟做错了什么?

没有。

听起来您的GCC默认配置为构建-pie二进制文件。 这些二进制文件实际上共享库( ET_DYN类型),除了它们像普通可执行文件一样运行。

所以你应该运行你的二进制文件,并且(如果它有效)不用担心它。

或者你可以将你的二进制文件与gcc -no-pie ...链接起来,这应该产生一个ET_EXEC类型的非PIE可执行文件,该file将说明ELF 64-bit LSB executable