“ Hello World” c cgi脚本在服务器上崩溃”

时间:2019-03-27 23:35:12

标签: c linux webserver cgi hosting

我正在尝试在托管的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”。

我尝试过:

  • 在Ubuntu 11.10上编译(由于auf内核3.0)
  • 使用-static编译

(使用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(服务器发行版所基于)的虚拟机上构建静态二进制文件是可行的!

1 个答案:

答案 0 :(得分:1)

库和链接器的行为可能相差很大。有问题的两个发行版甚至都没有在相同的主要内核版本上运行。听起来好像您是在使用比服务器上现有版本明显更高的glibc版本进行编译。

我建议您在虚拟机中设置交叉编译或运行CloudLinux 7,然后在VM中进行编译。

相关问题