我正在尝试在托管的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 Internal Server Error”。使用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
不幸的是,我没有外壳访问权限。
编辑:解决方案:
在安装了CentOS(服务器发行版所基于)的虚拟机上构建静态二进制文件是可行的!
答案 0 :(得分:1)
库和链接器的行为可能相差很大。有问题的两个发行版甚至都没有在相同的主要内核版本上运行。听起来好像您是在使用比服务器上现有版本明显更高的glibc版本进行编译。
我建议您在虚拟机中设置交叉编译或运行CloudLinux 7,然后在VM中进行编译。