[Bug other/70268] New: add option -ffile-prefix-map to map one directory name (old) to another (new) in __FILE__, __BASE_FILE__and __builtin_FILE()

hongxu.jia at windriver dot com gcc-bugzilla@gcc.gnu.org
Thu Mar 17 07:35:00 GMT 2016


            Bug ID: 70268
           Summary: add option -ffile-prefix-map to map one directory name
                    (old) to another (new) in __FILE__, __BASE_FILE__and
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hongxu.jia at windriver dot com
  Target Milestone: ---

Hi all,

I come from OpenEmbedded community (https://www.yoctoproject.org/),
and we use the powerful gcc for cross compilation. Previously, with
the help of Richard Biener and Jakub Jelinek, PR69821 was fixed which
do not expose the build path to others while '-g' used.

But there is another similar issue, while '__FILE__' used, this macro
expands to the name of the current input file which has build path.

I know the tradition solution is using relative path to compile.
(Such as instead of 'gcc /full/path/to/test.c',
try 'cd /full/path/to; gcc test.c; cd -;')

But if '__FILE__' exists in included header file and the header
file in standard system directories, the above way doesn't work.
Here is my test case:
1. Prepare a C source file and a C include file
$ cat << ENDOF > test.c
#include <stdio.h>
#include <test.h>

int main(int argc, char *argv[])
  printf("__FILE__ %s\n", __FILE__);
  return 0;


$ cat << ENDOF > test.h
#include <stdio.h>

void test(void)
  printf("__FILE__ %s\n", __FILE__);


2. Move include file to standard system directory.
$ sudo mv test.h /usr/include/

3. Compile C source file
$ gcc ./test.c -o test

4. Execute and the output shows full path header file.
$ ./test 
__FILE__ ./test.c
__FILE__ /usr/include/test.h

More information about the Gcc-bugs mailing list