«Привет мир» CGI скрипт падает на сервере » - PullRequest
3 голосов
/ 28 марта 2019

Я пытаюсь выполнить простой 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 kernel 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 Ответ

1 голос
/ 28 марта 2019

Библиотеки и поведение компоновщика могут сильно различаться. Эти два дистрибутива даже не работают на одной основной версии ядра. Похоже, вы компилируете против значительно более новой версии glibc, чем та, которая существует на вашем сервере.

Я рекомендую вам настроить кросс-компиляцию или запустить CloudLinux 7 на виртуальной машине и скомпилировать в ВМ.

...