【发布时间】:2020-05-05 17:02:22
【问题描述】:
由以下代码给出:
#include <stdio.h>
void output()
{
printf("hello \n");
}
int main()
{
output();
return 0;
}
当上述代码通过以下命令编译时:
gcc hello.c -shared -fPIC -pie -o libhello.so -Wl,-E
生成的libhello.so不仅是共享库,还是可执行文件。但是,当将 gcc 更改为 clang 时,如下所示
clang-10 hello.c -shared -fPIC -pie -o libhello.so -Wl,-E
编译给出以下警告:
clang: warning: argument unused during compilation: '-pie' [-Wunused-command-line-argument]
在执行clang-10编译的libhello.so时,也崩溃了。
问题: 1、gcc可以使用clang compile runnable shared lib吗?
注意:这个问题只是出于我自己的好奇心而提出的,我没有遇到任何实际问题。
【问题讨论】:
-
看起来
clang不像GCC那样喜欢生成可执行的共享库,因此它没有添加标准的libc函数来启动程序,也没有添加所需的PT_INTERPELF程序头,在启动时导致段错误,因为内核认为程序必须在没有解释器的情况下启动。您可以尝试编写自己的_start()函数,看看会发生什么。 -
@MarcoBonelli,非常感谢您的帮助。除了
_start(),我们还必须强制clang-10 在共享对象程序头中生成INTERP 段。问题中也给出了该示例的详细信息。 -
@MikeKinghan。感谢您的提示,我按照建议发布了一个新答案。