我正在尝试在托管的Web服务器上执行一个简单的c cgi脚本。我编译了这段代码:
#include <stdio.h>
int main(){
printf("Content-type: text/plain\n\n");
printf("<html>\n");
printf("<head><title>Testing CGI-Scripts</title></head>\n");
printf("<body>\n");
printf("<h1>Hello World</h1>\n");
printf("</body>\n");
printf("</html>\n");
return 0;
}
使用gcc -o index.cgi index.c
,将二进制文件上传到cgi-bin目录并将权限更改为755.然而,当执行脚本(url / cgi-bin / index.cgi)时,它会导致核心转储,我得到“500内部服务器”错误”。使用gdb分析核心转储让我“无法访问地址0x3000000000008处的内存”和“0x3000000000000”相同的行。
我试过了:
(使用静态二进制文件中的gdb进行分析:
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000401e82 in __libc_start_main ()
)
我的系统:Arch Linux,内核4.20.12 x86_64
服务器:CloudLinux 7,内核3.10.0-962.3.2.lve1.5.24.8.el7 x86_64
遗憾的是,我没有shell访问权限。
编辑:解决方案:
使用CentOS(Servers发行版所基于的)在虚拟机上构建静态二进制文件工作正常!
库和链接器行为可能差异很大。有问题的两个发行版甚至没有在相同的主要内核版本上运行。听起来你正在编译一个比你服务器上存在的glibc更新版本的glibc。
我建议您在虚拟机中设置交叉编译或运行CloudLinux 7,然后在VM中进行编译。