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