Необъявленная переменная в кросс-скомпилированной корневой файловой системе - PullRequest
0 голосов
/ 03 ноября 2019

Так что я кросс-компиляция корневой файловой системы Linux в основном с нуля. Я смог получить все основные кросс-компиляции программного обеспечения, используя очень простой набор инструментов с нуля. Ниже приведен список некоторых используемых программ:

  • Binutils 2.32
  • Glibc 2.29
  • Linux 5.2.11
  • Coreutils 8.31
  • GCC 9.2.0
  • pkgconf 1.6.3
  • Make, autoconf, zlib и т. Д. Для корневой файловой системы

Внутри rootfs с использованием chroot Я компилирую эту маленькую программу, используя gcc:

#include <stdio.h>
#include <limits.h>

int main()
{
  printf("PATH_MAX=%u\n", PATH_MAX);
  return 0;
}

, которая не завершается и выдает ошибку:

(chroot)$ gcc test.c -o test
test.c: In function 'main':
test.c:6:27: error: 'PATH_MAX' undeclared (first use in this function)
    6 |   printf("PATH_MAX=%u\n", PATH_MAX);
      |                           ^~~~~~~~
test.c:6:27: note: each undeclared identifier is reported only once for each function it appears in

Однако limits.h существует в chroot.

/usr/lib/gcc/x86_64-linux-gnu/9.2.0/install-tools/include/limits.h
/usr/lib/gcc/x86_64-linux-gnu/9.2.0/include-fixed/limits.h
/usr/include/c++/9.2.0/tr1/limits.h
/usr/include/limits.h
/usr/include/linux/limits.h

Наконец, ниже приведены пути для gcc внутри chroot (это не цепочка инструментов):

COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/9.2.0/cc1 -E -quiet -v /dev/null -mtune=generic -march=x86-64
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9.2.0/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/9.2.0/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/9.2.0/include-fixed
 /usr/include
End of search list.
# 1 "/dev/null"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "/dev/null"
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/

Так что, как говорится, что происходит? Я просмотрел свой набор инструментов и пакеты с корневой файловой системой несколько раз, и все выглядит хорошо. В чем может быть проблема? Также, какие шаги по отладке я могу предпринять, чтобы помочь идентифицировать эту проблему и любые будущие проблемы в будущем?

РЕДАКТИРОВАТЬ:

Чтобы добавить больше контекста по этой проблеме, ранее я пыталсячтобы скомпилировать последнюю версию kmod, но также получить ошибку 'PATH_MAX' undeclared:

make --no-print-directory all-recursive
Making all in .
  GEN      libkmod/libkmod.pc
  CC       tools/kmod.o
  CC       tools/lsmod.o
In file included from tools/kmod.c:26:
./shared/util.h:24:56: error: 'PATH_MAX' undeclared here (not in a function)
   24 | int alias_normalize(const char *alias, char buf[static PATH_MAX], size_t *len) _must_check_ __attribute__((nonnull(1,2)));
      |                                                        ^~~~~~~~

Переход на shared/util.h имеет #include <limits.h>, единственный способ исправить это использовать #include <linux/limits.h>, который в основном исправляетпроблема. Однако происходит нечто большее. Я не должен был этого делать. Я решил задать этот вопрос на гораздо более простом примере, чтобы вынести как можно больше переменных. Я надеюсь, что это принесет больше контекста в мою проблему.

1 Ответ

1 голос
/ 03 ноября 2019

<limits.h> является частью стандартной библиотеки C, так что вам действительно нужно это где-то, если не встроить в компилятор. PATH_MAX является расширением POSIX. Если по какой-то причине ваш кросс-компилятор не включает необходимые флаги, вы можете попробовать набрать

#define _POSIX_C_SOURCE 1
#include <limits.h>

. Если это все равно не удается, у вас не установлены целевые системные заголовки.

...