Использование std::fstream приводит к тому, что программа заканчивается СИГИЛЛОМ в PASE для i (7.3)

#c #g #fstream #ibm-midrange

Вопрос:

Я работаю в среде IBM i 7.3 из службы CECC IBM. Я пытаюсь протестировать большое приложение в среде PASE, но у меня возникли проблемы со сценариями, использующими <fstream> библиотеку. Открытие файла в режиме записи приводит к завершению сценариев SIGILL .

Чтобы проверить эту проблему, я написал следующий сценарий:

 #include <iostream>
#include <fstream>

int main()
{
        std::ofstream writer;

        std::cout << "Writing file.n" << std::endl;

        writer.open( "out.txt" );
        if ( !writer.is_open() || !writer.good() )
        {
            std::cerr << "Unable to open file." << std::endl;
            return (1);
        }

        writer << "This is a test.n" << std::endl;

        writer.close();

        return (0);

}
 

Выполнение сценария приводит к:

 Writing file.

Illegal instruction (core dumped)
 

В GDB:

 (gdb) run
Starting program: /storage/persist/[app-directory]/test/log/test_write
[New Thread 1]
Writing file.

Program received signal SIGILL, Illegal instruction.
[Switching to Thread 1]
0x08001000a0027940 in _localeinit.bss_3_ () from /QOpenSys/pkgs/bin/../lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/../../../libstdc  .so.6(shr_64.o)
(gdb) bt
#0  0x08001000a0027940 in _localeinit.bss_3_ () from /QOpenSys/pkgs/bin/../lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/../../../libstdc  .so.6(shr_64.o)
 

Я провел быструю проверку кода на вменяемость, скомпилировав и запустив его в системе разработки CentOS7, где он работает должным образом и возвращается без ошибок. Я также скопировал код в свою домашнюю папку, где он создает и записывает out.txt , как ожидалось, но все равно завершается SIGILL ошибкой, а не возвращается без кода ошибки. (Запуск в каталоге приложения также создает out.txt правильно, но потерпел неудачу, когда out.txt уже был создан с разрешениями -rwx------ ).

Подробные сведения

 g   --version
g  -6.bin (GCC) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.

g   -dumpmachine
powerpc-ibm-aix6.1.0.0
 

Библиотека C std была установлена со следующим пакетом:

 libstdcplusplus-devel.ppc64        6.3.0-29                    @ibm             
 

Код был скомпилирован с помощью следующей команды:

 g   -std=c  17 -Wall -g3 -O0 -fpie test_write.cpp -o test_write -lpthread
 

Другие программы, которые не используют <fstream> компиляцию и запускаются без ошибок. У меня возникли проблемы с поиском документации, объясняющей потенциальные причины этой проблемы, из-за эзотерической природы платформы PASE для i, но я ожидаю, что это как-то связано с настройками компилятора. Я хотел бы выяснить, в чем причина, чтобы я мог внести соответствующие изменения в свой код и/или файлы для его устранения.

Комментарии:

1. Обязательно скомпилируйте/свяжите все с опцией -pthread , иначе части ваших программ будут несовместимы друг с другом. ( errno это пример, проверьте его определение в errno.h )

Ответ №1:

При использовании GCC для компиляции для PASE вы должны использовать -pthread вместо -lpthread (или также установить -D_THREAD_SAFE ). Без этого вы можете столкнуться с проблемами, так как заголовочные файлы AIX, поставляемые PASE, имеют потоковое поведение во время компиляции. Кроме того, libstdc имеет другой ABI в зависимости от того, компилируетесь ли вы с -pthread платформами AIX или без них. В AIX GCC автоматически установит путь к библиотеке времени выполнения двоичного файла соответствующим образом для загрузки библиотек GCC с потоком или без потока, в то время как в среде с открытым исходным кодом на PASE мы отправляем только версию pthread.