"hello world" c cgi 脚本在服务器上崩溃”
"hello world" c cgi script crashes on server”
我正在尝试在托管网络服务器上执行一个简单的 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;
}
with gcc -o index.cgi index.c
, 将二进制文件上传到 cgi-bin 目录并将权限更改为 755。但是在执行脚本 (url/cgi-bin/index.cgi) 时它会导致核心转储,我收到“500 内部服务器错误”。用 gdb 分析核心转储得到了我 "Cannot access memory at address 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
服务器:云端Linux7、内核3.10.0-962.3.2.lve1.5.24.8.el7x86_64
不幸的是,我没有 shell 访问权限。
编辑:解决方案:
在安装了 CentOS(服务器发行版基于的)的虚拟机上构建静态二进制文件成功了!
库和链接器行为可能有很大差异。有问题的两个发行版甚至 运行 都没有在同一个主要内核版本上。听起来您正在编译的 glibc 版本比您服务器上现有的版本要新得多。
建议大家在虚拟机中设置交叉编译或者运行CloudLinux 7,在虚拟机中编译。
我正在尝试在托管网络服务器上执行一个简单的 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;
}
with gcc -o index.cgi index.c
, 将二进制文件上传到 cgi-bin 目录并将权限更改为 755。但是在执行脚本 (url/cgi-bin/index.cgi) 时它会导致核心转储,我收到“500 内部服务器错误”。用 gdb 分析核心转储得到了我 "Cannot access memory at address 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
服务器:云端Linux7、内核3.10.0-962.3.2.lve1.5.24.8.el7x86_64
不幸的是,我没有 shell 访问权限。
编辑:解决方案:
在安装了 CentOS(服务器发行版基于的)的虚拟机上构建静态二进制文件成功了!
库和链接器行为可能有很大差异。有问题的两个发行版甚至 运行 都没有在同一个主要内核版本上。听起来您正在编译的 glibc 版本比您服务器上现有的版本要新得多。
建议大家在虚拟机中设置交叉编译或者运行CloudLinux 7,在虚拟机中编译。