#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.