Hello,

perhaps related to the recent similar issue with "#include_next", it seems tcc 
fails to correctly include header files (or at least behaves differently from gcc/clang).
I'm using the latest revision ( 933c2235e5c9628aa3d80145dc6ddfa4967a9d70 from 
27-dec-2015 ).


This happens with GNU coreutils (latest version from git):

    git clone git://git.sv.gnu.org/coreutils.git
    cd coreutils
    ./bootstrap
    ./configure CC=tcc
    make

fails with:
    tcc  -I. -I./lib  -Ilib -I./lib -Isrc -I./src    -g -c -o lib/getfilecon.o 
lib/getfilecon.c
    lib/getfilecon.c:36: error: invalid type
    make[2]: *** [lib/getfilecon.o] Error 1

The offending line is:

    int getfilecon (char const *file, security_context_t *con);

And the culprit is that 'security_context_t' is not defined.
digging deeper, it seems that there are few 'selinux' local headers,
that in turn include the system's header:

    $ find -name "selinux.h"
    ./src/selinux.h
    ./lib/selinux/selinux.h

Using "-E" to see what is included, these are the differences between 
tcc,gcc,clang:

=== TCC ===
$ tcc  -I. -I./lib  -Ilib -I./lib -Isrc -I./src -g -E -o tcc-getfilecon.E 
lib/getfilecon.c
$ head -n12 tcc-getfilecon.E
# 1 "lib/getfilecon.c"
# 19 "lib/getfilecon.c"
# 1 "./lib/config.h" 1
# 20 "lib/getfilecon.c" 2

# 1 "./lib/selinux/selinux.h" 1
# 28 "./lib/selinux/selinux.h"
# 1 "lib/selinux/selinux.h" 1
# 29 "./lib/selinux/selinux.h" 2
# 22 "lib/getfilecon.c" 2

=== GCC ===
$ gcc  -I. -I./lib  -Ilib -I./lib -Isrc -I./src    -g -E -o gcc-getfilecon.E 
lib/getfilecon.c
$ head -n20 gcc-getfilecon.E
# 1 "lib/getfilecon.c"
# 1 "/home/gordon/projects/coreutils//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "lib/getfilecon.c"
# 19 "lib/getfilecon.c"
# 1 "./lib/config.h" 1
# 20 "lib/getfilecon.c" 2

# 1 "./lib/selinux/selinux.h" 1
# 28 "./lib/selinux/selinux.h"
# 1 "/usr/include/selinux/selinux.h" 1 3 4


=== CLANG ===
$ clang  -I. -I./lib  -Ilib -I./lib -Isrc -I./src    -g -E -o 
clang-getfilecon.E lib/getfilecon.c
$ head -n20 clang-getfilecon.E
# 1 "lib/getfilecon.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 316 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "lib/getfilecon.c" 2
# 19 "lib/getfilecon.c"
# 1 "./lib/config.h" 1
# 20 "lib/getfilecon.c" 2

# 1 "./lib/selinux/selinux.h" 1
# 28 "./lib/selinux/selinux.h"
# 1 "/usr/include/selinux/selinux.h" 1 3 4

====

So it seems that the "#include_next" in line 28 of the local 'selinux.h' 
(attached) goes to the system's header with gcc,clang but to the local one with tcc.

regards,
 - assaf




/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
/* Replacement <selinux/selinux.h> for platforms that lack it.
   Copyright (C) 2008-2015 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef _GL_SELINUX_SELINUX_H
# define _GL_SELINUX_SELINUX_H

# if __GNUC__ >= 3

# endif


# if HAVE_SELINUX_SELINUX_H

#include_next <selinux/selinux.h>

# else

#  include <sys/types.h>
#  include <errno.h>

#ifndef _GL_INLINE_HEADER_BEGIN
 #error "Please include config.h first."
#endif
_GL_INLINE_HEADER_BEGIN
#  ifndef SE_SELINUX_INLINE
#   define SE_SELINUX_INLINE _GL_INLINE
#  endif

/* The definition of _GL_UNUSED_PARAMETER is copied here.  */
/* _GL_UNUSED_PARAMETER is a marker that can be appended to function parameter
   declarations for parameters that are not used.  This helps to reduce
   warnings, such as from GCC -Wunused-parameter.  The syntax is as follows:
       type param _GL_UNUSED_PARAMETER
   or more generally
       param_decl _GL_UNUSED_PARAMETER
   For example:
       int param _GL_UNUSED_PARAMETER
       int *(*param)(void) _GL_UNUSED_PARAMETER
   Other possible, but obscure and discouraged syntaxes:
       int _GL_UNUSED_PARAMETER *(*param)(void)
       _GL_UNUSED_PARAMETER int *(*param)(void)
 */
#ifndef _GL_UNUSED_PARAMETER
# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
#  define _GL_UNUSED_PARAMETER __attribute__ ((__unused__))
# else
#  define _GL_UNUSED_PARAMETER
# endif
#endif

#  if !GNULIB_defined_security_types

typedef unsigned short security_class_t;
typedef char *security_context_t;
#   define is_selinux_enabled() 0

SE_SELINUX_INLINE int
getcon (security_context_t *con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE void
freecon (security_context_t con _GL_UNUSED_PARAMETER) {}

SE_SELINUX_INLINE int
getfscreatecon (security_context_t *con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
setfscreatecon (security_context_t con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
matchpathcon (char const *file _GL_UNUSED_PARAMETER,
              mode_t m _GL_UNUSED_PARAMETER,
  security_context_t *con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
getfilecon (char const *file _GL_UNUSED_PARAMETER,
            security_context_t *con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
lgetfilecon (char const *file _GL_UNUSED_PARAMETER,
             security_context_t *con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
fgetfilecon (int fd, security_context_t *con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
setfilecon (char const *file _GL_UNUSED_PARAMETER,
            security_context_t con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
lsetfilecon (char const *file _GL_UNUSED_PARAMETER,
             security_context_t con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
fsetfilecon (int fd _GL_UNUSED_PARAMETER,
             security_context_t con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }

SE_SELINUX_INLINE int
security_check_context (security_context_t con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
security_check_context_raw (security_context_t con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
setexeccon (security_context_t con _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE int
security_compute_create (security_context_t scon _GL_UNUSED_PARAMETER,
                         security_context_t tcon _GL_UNUSED_PARAMETER,
                         security_class_t tclass _GL_UNUSED_PARAMETER,
                         security_context_t *newcon _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }
SE_SELINUX_INLINE security_class_t
string_to_security_class (char const *name)
  { errno = ENOTSUP; return 0; }
SE_SELINUX_INLINE int
matchpathcon_init_prefix (char const *path _GL_UNUSED_PARAMETER,
                          char const *prefix _GL_UNUSED_PARAMETER)
  { errno = ENOTSUP; return -1; }

#   define GNULIB_defined_security_types 1
#  endif

#ifndef _GL_INLINE_HEADER_BEGIN
 #error "Please include config.h first."
#endif
_GL_INLINE_HEADER_BEGIN

# endif
#endif /* _GL_SELINUX_SELINUX_H */
_______________________________________________
Tinycc-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to