Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
slapos slapos
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Labels
    • Labels
  • Merge requests 122
    • Merge requests 122
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Environments
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Jobs
  • Commits
Collapse sidebar
  • nexedi
  • slaposslapos
  • Merge requests
  • !1630

Merged
Created Aug 26, 2024 by Carlos Ramos Carreño@vnmabusDeveloper

Fix wrong substitution in GCC's fixincludes.

  • Overview 18
  • Commits 1
  • Changes 1

Old GCC versions wrongly patched __has_include directives in system includes (using fixincludes). This was reported in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91085, and patches to fix this behavior are given in https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=6bf383c37e6131a8e247e8a0997d55d65c830b6d and are applied upstream in versions above 12.1. This commit applies these patches to older GCC versions.

This bug in GCC's fixincludes manifest itself with several seemingly unrelated symptoms. In particular, there are two conflicting "mount.h" includes, one coming from Linux and other from Glibc. Newer Glibc included some preprocessor tricks to detect if the Linux header has been previously included and prevent incompatibilities by not redefining common symbols, thus allowing its header to be included after the Linux header. In case that the header is included before the Linux header, it uses the aforementioned __has_include directive to detect and include the Linux header before itself if present, thus preventing its inclusion afterwards. However, due to the fixincludes wrong substitution, the check was always false, and thus including the Glibc header before the Linux one caused the compilation to fail, with an error similar to:

In file included from ./include/mount-api-utils.h:11,
                 from libmount/src/optlist.c:19:
/usr/include/linux/mount.h:95:6: error: redeclaration of 'enum fsconfig_command'
   95 | enum fsconfig_command {
      |      ^~~~~~~~~~~~~~~~
In file included from libmount/src/libmount.h:40,
                 from libmount/src/mountP.h:31,
                 from libmount/src/optlist.c:18:
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:249:6: note: originally defined here
  249 | enum fsconfig_command
      |      ^~~~~~~~~~~~~~~~
/usr/include/linux/mount.h:96:2: error: redeclaration of enumerator 'FSCONFIG_SET_FLAG'
   96 |  FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */
      |  ^~~~~~~~~~~~~~~~~
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:251:3: note: previous definition of 'FSCONFIG_SET_FLAG' was here
  251 |   FSCONFIG_SET_FLAG       = 0,    /* Set parameter, supplying no value */
      |   ^~~~~~~~~~~~~~~~~
/usr/include/linux/mount.h:97:2: error: redeclaration of enumerator 'FSCONFIG_SET_STRING'
   97 |  FSCONFIG_SET_STRING = 1, /* Set parameter, supplying a string value */
      |  ^~~~~~~~~~~~~~~~~~~
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:253:3: note: previous definition of 'FSCONFIG_SET_STRING' was here
  253 |   FSCONFIG_SET_STRING     = 1,    /* Set parameter, supplying a string value */
      |   ^~~~~~~~~~~~~~~~~~~
/usr/include/linux/mount.h:98:2: error: redeclaration of enumerator 'FSCONFIG_SET_BINARY'
   98 |  FSCONFIG_SET_BINARY = 2, /* Set parameter, supplying a binary blob value */
      |  ^~~~~~~~~~~~~~~~~~~
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:255:3: note: previous definition of 'FSCONFIG_SET_BINARY' was here
  255 |   FSCONFIG_SET_BINARY     = 2,    /* Set parameter, supplying a binary blob value */
      |   ^~~~~~~~~~~~~~~~~~~
/usr/include/linux/mount.h:99:2: error: redeclaration of enumerator 'FSCONFIG_SET_PATH'
   99 |  FSCONFIG_SET_PATH = 3, /* Set parameter, supplying an object by path */
      |  ^~~~~~~~~~~~~~~~~
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:257:3: note: previous definition of 'FSCONFIG_SET_PATH' was here
  257 |   FSCONFIG_SET_PATH       = 3,    /* Set parameter, supplying an object by path */
      |   ^~~~~~~~~~~~~~~~~
/usr/include/linux/mount.h:100:2: error: redeclaration of enumerator 'FSCONFIG_SET_PATH_EMPTY'
  100 |  FSCONFIG_SET_PATH_EMPTY = 4, /* Set parameter, supplying an object by (empty) path */
      |  ^~~~~~~~~~~~~~~~~~~~~~~
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:259:3: note: previous definition of 'FSCONFIG_SET_PATH_EMPTY' was here
  259 |   FSCONFIG_SET_PATH_EMPTY = 4,    /* Set parameter, supplying an object by (empty) path */
      |   ^~~~~~~~~~~~~~~~~~~~~~~
/usr/include/linux/mount.h:101:2: error: redeclaration of enumerator 'FSCONFIG_SET_FD'
  101 |  FSCONFIG_SET_FD  = 5, /* Set parameter, supplying an object by fd */
      |  ^~~~~~~~~~~~~~~
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:261:3: note: previous definition of 'FSCONFIG_SET_FD' was here
  261 |   FSCONFIG_SET_FD         = 5,    /* Set parameter, supplying an object by fd */
      |   ^~~~~~~~~~~~~~~
/usr/include/linux/mount.h:102:2: error: redeclaration of enumerator 'FSCONFIG_CMD_CREATE'
  102 |  FSCONFIG_CMD_CREATE = 6, /* Invoke superblock creation */
      |  ^~~~~~~~~~~~~~~~~~~
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:263:3: note: previous definition of 'FSCONFIG_CMD_CREATE' was here
  263 |   FSCONFIG_CMD_CREATE     = 6,    /* Invoke superblock creation */
      |   ^~~~~~~~~~~~~~~~~~~
/usr/include/linux/mount.h:103:2: error: redeclaration of enumerator 'FSCONFIG_CMD_RECONFIGURE'
  103 |  FSCONFIG_CMD_RECONFIGURE = 7, /* Invoke superblock reconfiguration */
      |  ^~~~~~~~~~~~~~~~~~~~~~~~
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:265:3: note: previous definition of 'FSCONFIG_CMD_RECONFIGURE' was here
  265 |   FSCONFIG_CMD_RECONFIGURE = 7,   /* Invoke superblock reconfiguration */
      |   ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from ./include/mount-api-utils.h:11,
                 from libmount/src/optlist.c:19:
/usr/include/linux/mount.h:129:8: error: redefinition of 'struct mount_attr'
  129 | struct mount_attr {
      |        ^~~~~~~~~~
In file included from libmount/src/libmount.h:40,
                 from libmount/src/mountP.h:31,
                 from libmount/src/optlist.c:18:
/opt/slapgrid/0f0705ad6e3e586cc45dcb5c9ab9e5f6/parts/gcc-10.5/lib/gcc/x86_64-pc-linux-gnu/10.5.0/include-fixed/sys/mount.h:219:8: note: originally defined here
  219 | struct mount_attr
      |        ^~~~~~~~~~
make[2]: *** [Makefile:12048: libmount/src/la-optlist.lo] Error 1

This error was originally detected in Nexedi in fe60394b (comment 189391) by @vpelletier, but no action was taken at the time to solve it. Some of its symptoms were detected and fixed individually in !1579 (merged) and !1580 (closed) , by reordering the includes, but the above error in libmount, which could not be solved that easily, made me delve more into the problem and find the root cause.

Assignee
Assign to
Reviewer
Request review from
None
Milestone
None
Assign milestone
Time tracking
Source branch: fix/gcc-fixincludes
GitLab Nexedi Edition | About GitLab | About Nexedi | 沪ICP备2021021310号-2 | 沪ICP备2021021310号-7