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 ./test
或gcc 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
。