qemu-irix не собирается под Alpine 3.10 (G CC 8.3) - PullRequest
1 голос
/ 08 мая 2020

Ради удовольствия, я пытаюсь собрать irixxxx s qemu-irix как образ Docker.

Он успешно собирается под Debian Buster (с использованием контейнера G CC 8). Однако он не может быть собран под Alpine 3.10 (он терпит неудачу только тогда, когда я выбрал цели Irix) со следующими ошибками (на этапе make):

  CC      util/oslib-posix.o
In file included from util/oslib-posix.c:39:
/usr/include/sys/signal.h:1:2: warning: #warning redirecting incorrect #include <sys/signal.h> to <signal.h> [-Wcpp]
 #warning redirecting incorrect #include <sys/signal.h> to <signal.h>
  ^~~~~~~
  CC      util/qemu-openpty.o
util/qemu-openpty.c: In function 'qemu_openpty_raw':
util/qemu-openpty.c:123:9: warning: implicit declaration of function 'openpty'; did you mean 'openat'? [-Wimplicit-function-declaration]
     if (openpty(&amaster, aslave, pty_buf, NULL, NULL) < 0) {
         ^~~~~~~
         openat
util/qemu-openpty.c:123:9: warning: nested extern declaration of 'openpty' [-Wnested-externs]

(...)

  CC      irix-linux-user/linux-user/syscall.o
/qemu-irix/linux-user/syscall.c:6784:22: error: 'F_EXLCK' undeclared here (not in a function); did you mean 'F_RDLCK'?
     TRANSTBL_CONVERT(F_EXLCK),
                      ^~~~~~~
/qemu-irix/linux-user/syscall.c:6779:51: note: in definition of macro 'TRANSTBL_CONVERT'
 #define TRANSTBL_CONVERT(a) { -1, TARGET_##a, -1, a }
                                                   ^
/qemu-irix/linux-user/syscall.c:6785:22: error: 'F_SHLCK' undeclared here (not in a function); did you mean 'F_RDLCK'?
     TRANSTBL_CONVERT(F_SHLCK),
                      ^~~~~~~
/qemu-irix/linux-user/syscall.c:6779:51: note: in definition of macro 'TRANSTBL_CONVERT'
 #define TRANSTBL_CONVERT(a) { -1, TARGET_##a, -1, a }
                                                   ^
In file included from /qemu-irix/linux-user/syscall.c:121:
/qemu-irix/linux-user/syscall.c: In function 'target_to_host_sigevent':
/qemu-irix/linux-user/syscall.c:7422:27: error: 'struct sigevent' has no member named '_sigev_un'; did you mean 'sigev_value'?
     __get_user(host_sevp->_sigev_un._tid, &target_sevp->_sigev_un._tid);
                           ^~~~~~~~~
/qemu-irix/linux-user/qemu.h:501:5: note: in definition of macro '__get_user_e'
   ((x) = (typeof(*hptr))(                                               \
     ^
/qemu-irix/linux-user/syscall.c:7422:5: note: in expansion of macro '__get_user'
     __get_user(host_sevp->_sigev_un._tid, &target_sevp->_sigev_un._tid);
     ^~~~~~~~~~
/qemu-irix/linux-user/syscall.c:7422:36: error: '(const bitmask_transtbl *)&<erroneous-expression>' is a pointer; did you mean to use '->'?
     __get_user(host_sevp->_sigev_un._tid, &target_sevp->_sigev_un._tid);
                                    ^
/qemu-irix/linux-user/qemu.h:501:5: note: in definition of macro '__get_user_e'
   ((x) = (typeof(*hptr))(                                               \
     ^
/qemu-irix/linux-user/syscall.c:7422:5: note: in expansion of macro '__get_user'
     __get_user(host_sevp->_sigev_un._tid, &target_sevp->_sigev_un._tid);
     ^~~~~~~~~~
/qemu-irix/linux-user/qemu.h:506:13: warning: left-hand operand of comma expression has no effect [-Wunused-value]
      (hptr)), (void)0)
             ^
/qemu-irix/linux-user/qemu.h:510:31: note: in expansion of macro '__get_user_e'
 # define __get_user(x, hptr)  __get_user_e(x, hptr, be)
                               ^~~~~~~~~~~~
/qemu-irix/linux-user/syscall.c:7422:5: note: in expansion of macro '__get_user'
     __get_user(host_sevp->_sigev_un._tid, &target_sevp->_sigev_un._tid);
     ^~~~~~~~~~
/qemu-irix/linux-user/syscall.c: In function 'do_syscall':
/qemu-irix/linux-user/syscall.c:13545:25: warning: implicit declaration of function 'sethostid'; did you mean 'gethostid'? [-Wimplicit-function-declaration]
         ret = get_errno(sethostid(arg1));
                         ^~~~~~~~~
                         gethostid
/qemu-irix/linux-user/syscall.c:13545:25: warning: nested extern declaration of 'sethostid' [-Wnested-externs]
make[1]: *** [/qemu-irix/rules.mak:66: linux-user/syscall.o] Error 1
make: *** [Makefile:472: subdir-irix-linux-user] Error 2
The command '/bin/sh -c make && DESTDIR=/tmp/qemu make install' returned a non-zero code: 2

Я исследовал различия между Debian. и Alpine G CC (фактически, libc6 и musl) об аналогичных сбоях, но я не нашел никакой информации о том, как решить эту проблему без изменения кода.

Итак, где я могу найти дополнительную информацию об этой проблеме и какие пакеты могут ее решить? Спасибо.

Dockerfiles и полный лог здесь . Docker образ контейнера (Debian Buster) здесь .

1 Ответ

1 голос
/ 09 мая 2020

Разница, по-видимому, вызвана базовыми реализациями lib c: glib c Debian, против musl-lib c Alpine.

В то время как GNU lib c является стандартной реализацией lib c в Linux, musl lib c используется несколькими дистрибутивами, такими как Alpine Linux и Void Linux. musl - это минималистичная реализация c strict-POSIX lib c, которая обычно несовместима с glib c. Обычно программные проекты должны быть перенесены в musl lib c для поддержки в Alpine, особенно нетривиальных приложений.

Компиляция syscall.c прерывается в нескольких местах, первое из которых:

/qemu-irix/linux-user/syscall.c:6784:22: error: 'F_EXLCK' undeclared here (not in a function); did you mean 'F_RDLCK'?
 TRANSTBL_CONVERT(F_EXLCK)

Макрос F_EXLCK is не определен в musl lib c s fcntl.h. Однако его можно легко исправить, указав его вручную, например, с помощью make CFLAGS='"-DF_EXLCK=4"'. Вот как исправляется qemu для musl для целей, отличных от irix ( patch link ).

Однако в будущем появятся и другие неопределенные макросы, такие как __SIGRTMIN и __SIGRTMAX , макрос TRANSTBL_CONVERT и, возможно, другие. Исправить их ad-ho c может быть недостаточно - похоже, что проект qemu-irix должен быть правильно портирован для Alpine и musl lib c.

Если хотите, вы можете попробовать следующие существующие патчи qemu musl и попытаться исправить его самостоятельно для qemu-irix:
- https://lists.gnu.org/archive/html/qemu-devel/2014-04/msg04773.html
- https://github.com/NixOS/nixpkgs/pull/46449/files

Off topi c комментарий, используйте make -j для параллельной сборки, которая закончится намного быстрее.

...