Путеводитель по Руководству Linux

  User  |  Syst  |  Libr  |  Device  |  Files  |  Other  |  Admin  |  Head  |



   gcc    ( 1 )

компилятор C и C ++ проекта GNU (GNU project C and C++ compiler)

  Name  |  Synopsis  |  Description  |  Options  |    Options detail    |  Environment  |  Bugs  |  Note  |  See also  |

Параметры подробно (Options detail)


  Controlling the Kind of Output  |  Compiling C++ Programs  |  Controlling C Dialect  |  Controlling C++ Dialect  |  Controlling Objective-C and Objective-C++ Dialects  |  Control Diagnostic Messages Formatting  |  Request or Suppress Warnings 1  |  Request or Suppress Warnings 2  |  Request or Suppress Warnings 3  |  Debugging Your Program  |  Control Optimization 1  |  Control Optimization 2  |  Control Optimization 3  |  Control Optimization 4  |    Program Instrumentation    |  Controlling the Preprocessor  |  Linking  |  Directory Search  |  Code Generation Conventions  |  GCC Developer  |  Machine-Dependent  |  AArch64  |  Adapteva Epiphany  |  AMD GCN  |  ARC  |  ARM  |  AVR  |  Blackfin  |  C6X  |  CRIS  |  CR16  |  C-SKY  |  Darwin  |  DEC Alpha  |  FR30  |  FT32  |  FRV  |  GNU/Linux  |  H8/300  |  HPPA  |  IA-64  |  LM32  |  M32C  |  M32R/D  |  M680x0  |  MCore  |  MeP  |  MicroBlaze  |  MIPS  |  MMIX  |  MN10300  |  Moxie  |  MSP430  |  NDS32  |  Nios II  |  Nvidia PTX  |  OpenRISC  |  PDP-11  |  picoChip  |  RISC-V  |  RL78  |  IBM RS/6000 and PowerPC  |  RX  |  S/390 and zSeries  |  Score  |  SH  |  Solaris 2  |  SPARC  |  SPU  |  System V  |  TILE-Gx  |  TILEPro  |  V850  |  VAX  |  Visium  |  VMS  |  VxWorks  |  x86 1  |  x86 2  |  x86 Windows  |  Xstormy16  |  Xtensa  |

Program Instrumentation

GCC supports a number of command-line options that control adding
       run-time instrumentation to the code it normally generates.  For
       example, one purpose of instrumentation is collect profiling
       statistics for use in finding program hot spots, code coverage
       analysis, or profile-guided optimizations.  Another class of
       program instrumentation is adding run-time checking to detect
       programming errors like invalid pointer dereferences or out-of-
       bounds array accesses, as well as deliberately hostile attacks
       such as stack smashing or C++ vtable hijacking.  There is also a
       general hook which can be used to implement other forms of
       tracing or function-level instrumentation for debug or program
       analysis purposes.

       -p
       -pg Generate extra code to write profile information suitable for
           the analysis program prof (for -p) or gprof (for -pg).  You
           must use this option when compiling the source files you want
           data about, and you must also use it when linking.

           You can use the function attribute "no_instrument_function"
           to suppress profiling of individual functions when compiling
           with these options.

       -fprofile-arcs
           Add code so that program flow arcs are instrumented.  During
           execution the program records how many times each branch and
           call is executed and how many times it is taken or returns.
           On targets that support constructors with priority support,
           profiling properly handles constructors, destructors and C++
           constructors (and destructors) of classes which are used as a
           type of a global variable.

           When the compiled program exits it saves this data to a file
           called auxname.gcda for each source file.  The data may be
           used for profile-directed optimizations
           (-fbranch-probabilities), or for test coverage analysis
           (-ftest-coverage).  Each object file's auxname is generated
           from the name of the output file, if explicitly specified and
           it is not the final executable, otherwise it is the basename
           of the source file.  In both cases any suffix is removed
           (e.g. foo.gcda for input file dir/foo.c, or dir/foo.gcda for
           output file specified as -o dir/foo.o).

       --coverage
           This option is used to compile and link code instrumented for
           coverage analysis.  The option is a synonym for
           -fprofile-arcs -ftest-coverage (when compiling) and -lgcov
           (when linking).  See the documentation for those options for
           more details.

           *   Compile the source files with -fprofile-arcs plus
               optimization and code generation options.  For test
               coverage analysis, use the additional -ftest-coverage
               option.  You do not need to profile every source file in
               a program.

           *   Compile the source files additionally with
               -fprofile-abs-path to create absolute path names in the
               .gcno files.  This allows gcov to find the correct
               sources in projects where compilations occur with
               different working directories.

           *   Link your object files with -lgcov or -fprofile-arcs (the
               latter implies the former).

           *   Run the program on a representative workload to generate
               the arc profile information.  This may be repeated any
               number of times.  You can run concurrent instances of
               your program, and provided that the file system supports
               locking, the data files will be correctly updated.
               Unless a strict ISO C dialect option is in effect, "fork"
               calls are detected and correctly handled without double
               counting.

           *   For profile-directed optimizations, compile the source
               files again with the same optimization and code
               generation options plus -fbranch-probabilities.

           *   For test coverage analysis, use gcov to produce human
               readable information from the .gcno and .gcda files.
               Refer to the gcov documentation for further information.

           With -fprofile-arcs, for each function of your program GCC
           creates a program flow graph, then finds a spanning tree for
           the graph.  Only arcs that are not on the spanning tree have
           to be instrumented: the compiler adds code to count the
           number of times that these arcs are executed.  When an arc is
           the only exit or only entrance to a block, the
           instrumentation code can be added to the block; otherwise, a
           new basic block must be created to hold the instrumentation
           code.

       -ftest-coverage
           Produce a notes file that the gcov code-coverage utility can
           use to show program coverage.  Each source file's note file
           is called auxname.gcno.  Refer to the -fprofile-arcs option
           above for a description of auxname and instructions on how to
           generate test coverage data.  Coverage data matches the
           source files more closely if you do not optimize.

       -fprofile-abs-path
           Automatically convert relative source file names to absolute
           path names in the .gcno files.  This allows gcov to find the
           correct sources in projects where compilations occur with
           different working directories.

       -fprofile-dir=path
           Set the directory to search for the profile data files in to
           path.  This option affects only the profile data generated by
           -fprofile-generate, -ftest-coverage, -fprofile-arcs and used
           by -fprofile-use and -fbranch-probabilities and its related
           options.  Both absolute and relative paths can be used.  By
           default, GCC uses the current directory as path, thus the
           profile data file appears in the same directory as the object
           file.  In order to prevent the file name clashing, if the
           object file name is not an absolute path, we mangle the
           absolute path of the sourcename.gcda file and use it as the
           file name of a .gcda file.

           When an executable is run in a massive parallel environment,
           it is recommended to save profile to different folders.  That
           can be done with variables in path that are exported during
           run-time:

           %p  process ID.

           %q{VAR}
               value of environment variable VAR

       -fprofile-generate
       -fprofile-generate=path
           Enable options usually used for instrumenting application to
           produce profile useful for later recompilation with profile
           feedback based optimization.  You must use -fprofile-generate
           both when compiling and when linking your program.

           The following options are enabled: -fprofile-arcs,
           -fprofile-values, -finline-functions, and -fipa-bit-cp.

           If path is specified, GCC looks at the path to find the
           profile feedback data files. See -fprofile-dir.

           To optimize the program based on the collected profile
           information, use -fprofile-use.

       -fprofile-update=method
           Alter the update method for an application instrumented for
           profile feedback based optimization.  The method argument
           should be one of single, atomic or prefer-atomic.  The first
           one is useful for single-threaded applications, while the
           second one prevents profile corruption by emitting thread-
           safe code.

           Warning: When an application does not properly join all
           threads (or creates an detached thread), a profile file can
           be still corrupted.

           Using prefer-atomic would be transformed either to atomic,
           when supported by a target, or to single otherwise.  The GCC
           driver automatically selects prefer-atomic when -pthread is
           present in the command line.

       -fprofile-filter-files=regex
           Instrument only functions from files where names match any
           regular expression (separated by a semi-colon).

           For example, -fprofile-filter-files=main.c;module.*.c will
           instrument only main.c and all C files starting with
           'module'.

       -fprofile-exclude-files=regex
           Instrument only functions from files where names do not match
           all the regular expressions (separated by a semi-colon).

           For example, -fprofile-exclude-files=/usr/* will prevent
           instrumentation of all files that are located in /usr/
           folder.

       -fsanitize=address
           Enable AddressSanitizer, a fast memory error detector.
           Memory access instructions are instrumented to detect out-of-
           bounds and use-after-free bugs.  The option enables
           -fsanitize-address-use-after-scope.  See
           <https://github.com/google/sanitizers/wiki/AddressSanitizer >
           for more details.  The run-time behavior can be influenced
           using the ASAN_OPTIONS environment variable.  When set to
           "help=1", the available options are shown at startup of the
           instrumented program.  See
           <https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags >
           for a list of supported options.  The option cannot be
           combined with -fsanitize=thread.

       -fsanitize=kernel-address
           Enable AddressSanitizer for Linux kernel.  See
           <https://github.com/google/kasan/wiki > for more details.

       -fsanitize=pointer-compare
           Instrument comparison operation (<, <=, >, >=) with pointer
           operands.  The option must be combined with either
           -fsanitize=kernel-address or -fsanitize=address The option
           cannot be combined with -fsanitize=thread.  Note: By default
           the check is disabled at run time.  To enable it, add
           "detect_invalid_pointer_pairs=2" to the environment variable
           ASAN_OPTIONS. Using "detect_invalid_pointer_pairs=1" detects
           invalid operation only when both pointers are non-null.

       -fsanitize=pointer-subtract
           Instrument subtraction with pointer operands.  The option
           must be combined with either -fsanitize=kernel-address or
           -fsanitize=address The option cannot be combined with
           -fsanitize=thread.  Note: By default the check is disabled at
           run time.  To enable it, add "detect_invalid_pointer_pairs=2"
           to the environment variable ASAN_OPTIONS. Using
           "detect_invalid_pointer_pairs=1" detects invalid operation
           only when both pointers are non-null.

       -fsanitize=thread
           Enable ThreadSanitizer, a fast data race detector.  Memory
           access instructions are instrumented to detect data race
           bugs.  See
           <https://github.com/google/sanitizers/wiki#threadsanitizer >
           for more details. The run-time behavior can be influenced
           using the TSAN_OPTIONS environment variable; see
           <https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags >
           for a list of supported options.  The option cannot be
           combined with -fsanitize=address, -fsanitize=leak.

           Note that sanitized atomic builtins cannot throw exceptions
           when operating on invalid memory addresses with non-call
           exceptions (-fnon-call-exceptions).

       -fsanitize=leak
           Enable LeakSanitizer, a memory leak detector.  This option
           only matters for linking of executables and the executable is
           linked against a library that overrides "malloc" and other
           allocator functions.  See
           <https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer >
           for more details.  The run-time behavior can be influenced
           using the LSAN_OPTIONS environment variable.  The option
           cannot be combined with -fsanitize=thread.

       -fsanitize=undefined
           Enable UndefinedBehaviorSanitizer, a fast undefined behavior
           detector.  Various computations are instrumented to detect
           undefined behavior at runtime.  Current suboptions are:

           -fsanitize=shift
               This option enables checking that the result of a shift
               operation is not undefined.  Note that what exactly is
               considered undefined differs slightly between C and C++,
               as well as between ISO C90 and C99, etc.  This option has
               two suboptions, -fsanitize=shift-base and
               -fsanitize=shift-exponent.

           -fsanitize=shift-exponent
               This option enables checking that the second argument of
               a shift operation is not negative and is smaller than the
               precision of the promoted first argument.

           -fsanitize=shift-base
               If the second argument of a shift operation is within
               range, check that the result of a shift operation is not
               undefined.  Note that what exactly is considered
               undefined differs slightly between C and C++, as well as
               between ISO C90 and C99, etc.

           -fsanitize=integer-divide-by-zero
               Detect integer division by zero as well as "INT_MIN / -1"
               division.

           -fsanitize=unreachable
               With this option, the compiler turns the
               "__builtin_unreachable" call into a diagnostics message
               call instead.  When reaching the "__builtin_unreachable"
               call, the behavior is undefined.

           -fsanitize=vla-bound
               This option instructs the compiler to check that the size
               of a variable length array is positive.

           -fsanitize=null
               This option enables pointer checking.  Particularly, the
               application built with this option turned on will issue
               an error message when it tries to dereference a NULL
               pointer, or if a reference (possibly an rvalue reference)
               is bound to a NULL pointer, or if a method is invoked on
               an object pointed by a NULL pointer.

           -fsanitize=return
               This option enables return statement checking.  Programs
               built with this option turned on will issue an error
               message when the end of a non-void function is reached
               without actually returning a value.  This option works in
               C++ only.

           -fsanitize=signed-integer-overflow
               This option enables signed integer overflow checking.  We
               check that the result of "+", "*", and both unary and
               binary "-" does not overflow in the signed arithmetics.
               Note, integer promotion rules must be taken into account.
               That is, the following is not an overflow:

                       signed char a = SCHAR_MAX;
                       a++;

           -fsanitize=bounds
               This option enables instrumentation of array bounds.
               Various out of bounds accesses are detected.  Flexible
               array members, flexible array member-like arrays, and
               initializers of variables with static storage are not
               instrumented.

           -fsanitize=bounds-strict
               This option enables strict instrumentation of array
               bounds.  Most out of bounds accesses are detected,
               including flexible array members and flexible array
               member-like arrays.  Initializers of variables with
               static storage are not instrumented.

           -fsanitize=alignment
               This option enables checking of alignment of pointers
               when they are dereferenced, or when a reference is bound
               to insufficiently aligned target, or when a method or
               constructor is invoked on insufficiently aligned object.

           -fsanitize=object-size
               This option enables instrumentation of memory references
               using the "__builtin_object_size" function.  Various out
               of bounds pointer accesses are detected.

           -fsanitize=float-divide-by-zero
               Detect floating-point division by zero.  Unlike other
               similar options, -fsanitize=float-divide-by-zero is not
               enabled by -fsanitize=undefined, since floating-point
               division by zero can be a legitimate way of obtaining
               infinities and NaNs.

           -fsanitize=float-cast-overflow
               This option enables floating-point type to integer
               conversion checking.  We check that the result of the
               conversion does not overflow.  Unlike other similar
               options, -fsanitize=float-cast-overflow is not enabled by
               -fsanitize=undefined.  This option does not work well
               with "FE_INVALID" exceptions enabled.

           -fsanitize=nonnull-attribute
               This option enables instrumentation of calls, checking
               whether null values are not passed to arguments marked as
               requiring a non-null value by the "nonnull" function
               attribute.

           -fsanitize=returns-nonnull-attribute
               This option enables instrumentation of return statements
               in functions marked with "returns_nonnull" function
               attribute, to detect returning of null values from such
               functions.

           -fsanitize=bool
               This option enables instrumentation of loads from bool.
               If a value other than 0/1 is loaded, a run-time error is
               issued.

           -fsanitize=enum
               This option enables instrumentation of loads from an enum
               type.  If a value outside the range of values for the
               enum type is loaded, a run-time error is issued.

           -fsanitize=vptr
               This option enables instrumentation of C++ member
               function calls, member accesses and some conversions
               between pointers to base and derived classes, to verify
               the referenced object has the correct dynamic type.

           -fsanitize=pointer-overflow
               This option enables instrumentation of pointer
               arithmetics.  If the pointer arithmetics overflows, a
               run-time error is issued.

           -fsanitize=builtin
               This option enables instrumentation of arguments to
               selected builtin functions.  If an invalid value is
               passed to such arguments, a run-time error is issued.
               E.g. passing 0 as the argument to "__builtin_ctz" or
               "__builtin_clz" invokes undefined behavior and is
               diagnosed by this option.

           While -ftrapv causes traps for signed overflows to be
           emitted, -fsanitize=undefined gives a diagnostic message.
           This currently works only for the C family of languages.

       -fno-sanitize=all
           This option disables all previously enabled sanitizers.
           -fsanitize=all is not allowed, as some sanitizers cannot be
           used together.

       -fasan-shadow-offset=number
           This option forces GCC to use custom shadow offset in
           AddressSanitizer checks.  It is useful for experimenting with
           different shadow memory layouts in Kernel AddressSanitizer.

       -fsanitize-sections=s1,s2,...
           Sanitize global variables in selected user-defined sections.
           si may contain wildcards.

       -fsanitize-recover[=opts]
           -fsanitize-recover= controls error recovery mode for
           sanitizers mentioned in comma-separated list of opts.
           Enabling this option for a sanitizer component causes it to
           attempt to continue running the program as if no error
           happened.  This means multiple runtime errors can be reported
           in a single program run, and the exit code of the program may
           indicate success even when errors have been reported.  The
           -fno-sanitize-recover= option can be used to alter this
           behavior: only the first detected error is reported and
           program then exits with a non-zero exit code.

           Currently this feature only works for -fsanitize=undefined
           (and its suboptions except for -fsanitize=unreachable and
           -fsanitize=return), -fsanitize=float-cast-overflow,
           -fsanitize=float-divide-by-zero, -fsanitize=bounds-strict,
           -fsanitize=kernel-address and -fsanitize=address.  For these
           sanitizers error recovery is turned on by default, except
           -fsanitize=address, for which this feature is experimental.
           -fsanitize-recover=all and -fno-sanitize-recover=all is also
           accepted, the former enables recovery for all sanitizers that
           support it, the latter disables recovery for all sanitizers
           that support it.

           Even if a recovery mode is turned on the compiler side, it
           needs to be also enabled on the runtime library side,
           otherwise the failures are still fatal.  The runtime library
           defaults to "halt_on_error=0" for ThreadSanitizer and
           UndefinedBehaviorSanitizer, while default value for
           AddressSanitizer is "halt_on_error=1". This can be overridden
           through setting the "halt_on_error" flag in the corresponding
           environment variable.

           Syntax without an explicit opts parameter is deprecated.  It
           is equivalent to specifying an opts list of:

                   undefined,float-cast-overflow,float-divide-by-zero,bounds-strict

       -fsanitize-address-use-after-scope
           Enable sanitization of local variables to detect use-after-
           scope bugs.  The option sets -fstack-reuse to none.

       -fsanitize-undefined-trap-on-error
           The -fsanitize-undefined-trap-on-error option instructs the
           compiler to report undefined behavior using "__builtin_trap"
           rather than a "libubsan" library routine.  The advantage of
           this is that the "libubsan" library is not needed and is not
           linked in, so this is usable even in freestanding
           environments.

       -fsanitize-coverage=trace-pc
           Enable coverage-guided fuzzing code instrumentation.  Inserts
           a call to "__sanitizer_cov_trace_pc" into every basic block.

       -fsanitize-coverage=trace-cmp
           Enable dataflow guided fuzzing code instrumentation.  Inserts
           a call to "__sanitizer_cov_trace_cmp1",
           "__sanitizer_cov_trace_cmp2", "__sanitizer_cov_trace_cmp4" or
           "__sanitizer_cov_trace_cmp8" for integral comparison with
           both operands variable or "__sanitizer_cov_trace_const_cmp1",
           "__sanitizer_cov_trace_const_cmp2",
           "__sanitizer_cov_trace_const_cmp4" or
           "__sanitizer_cov_trace_const_cmp8" for integral comparison
           with one operand constant, "__sanitizer_cov_trace_cmpf" or
           "__sanitizer_cov_trace_cmpd" for float or double comparisons
           and "__sanitizer_cov_trace_switch" for switch statements.

       -fcf-protection=[full|branch|return|none]
           Enable code instrumentation of control-flow transfers to
           increase program security by checking that target addresses
           of control-flow transfer instructions (such as indirect
           function call, function return, indirect jump) are valid.
           This prevents diverting the flow of control to an unexpected
           target.  This is intended to protect against such threats as
           Return-oriented Programming (ROP), and similarly
           call/jmp-oriented programming (COP/JOP).

           The value "branch" tells the compiler to implement checking
           of validity of control-flow transfer at the point of indirect
           branch instructions, i.e. call/jmp instructions.  The value
           "return" implements checking of validity at the point of
           returning from a function.  The value "full" is an alias for
           specifying both "branch" and "return". The value "none" turns
           off instrumentation.

           The macro "__CET__" is defined when -fcf-protection is used.
           The first bit of "__CET__" is set to 1 for the value "branch"
           and the second bit of "__CET__" is set to 1 for the "return".

           You can also use the "nocf_check" attribute to identify which
           functions and calls should be skipped from instrumentation.

           Currently the x86 GNU/Linux target provides an implementation
           based on Intel Control-flow Enforcement Technology (CET).

       -fstack-protector
           Emit extra code to check for buffer overflows, such as stack
           smashing attacks.  This is done by adding a guard variable to
           functions with vulnerable objects.  This includes functions
           that call "alloca", and functions with buffers larger than 8
           bytes.  The guards are initialized when a function is entered
           and then checked when the function exits.  If a guard check
           fails, an error message is printed and the program exits.

       -fstack-protector-all
           Like -fstack-protector except that all functions are
           protected.

       -fstack-protector-strong
           Like -fstack-protector but includes additional functions to
           be protected --- those that have local array definitions, or
           have references to local frame addresses.

       -fstack-protector-explicit
           Like -fstack-protector but only protects those functions
           which have the "stack_protect" attribute.

       -fstack-check
           Generate code to verify that you do not go beyond the
           boundary of the stack.  You should specify this flag if you
           are running in an environment with multiple threads, but you
           only rarely need to specify it in a single-threaded
           environment since stack overflow is automatically detected on
           nearly all systems if there is only one stack.

           Note that this switch does not actually cause checking to be
           done; the operating system or the language runtime must do
           that.  The switch causes generation of code to ensure that
           they see the stack being extended.

           You can additionally specify a string parameter: no means no
           checking, generic means force the use of old-style checking,
           specific means use the best checking method and is equivalent
           to bare -fstack-check.

           Old-style checking is a generic mechanism that requires no
           specific target support in the compiler but comes with the
           following drawbacks:

           1.  Modified allocation strategy for large objects: they are
               always allocated dynamically if their size exceeds a
               fixed threshold.  Note this may change the semantics of
               some code.

           2.  Fixed limit on the size of the static frame of functions:
               when it is topped by a particular function, stack
               checking is not reliable and a warning is issued by the
               compiler.

           3.  Inefficiency: because of both the modified allocation
               strategy and the generic implementation, code performance
               is hampered.

           Note that old-style stack checking is also the fallback
           method for specific if no target support has been added in
           the compiler.

           -fstack-check= is designed for Ada's needs to detect infinite
           recursion and stack overflows.  specific is an excellent
           choice when compiling Ada code.  It is not generally
           sufficient to protect against stack-clash attacks.  To
           protect against those you want -fstack-clash-protection.

       -fstack-clash-protection
           Generate code to prevent stack clash style attacks.  When
           this option is enabled, the compiler will only allocate one
           page of stack space at a time and each page is accessed
           immediately after allocation.  Thus, it prevents allocations
           from jumping over any stack guard page provided by the
           operating system.

           Most targets do not fully support stack clash protection.
           However, on those targets -fstack-clash-protection will
           protect dynamic stack allocations.  -fstack-clash-protection
           may also provide limited protection for static stack
           allocations if the target supports -fstack-check=specific.

       -fstack-limit-register=reg
       -fstack-limit-symbol=sym
       -fno-stack-limit
           Generate code to ensure that the stack does not grow beyond a
           certain value, either the value of a register or the address
           of a symbol.  If a larger stack is required, a signal is
           raised at run time.  For most targets, the signal is raised
           before the stack overruns the boundary, so it is possible to
           catch the signal without taking special precautions.

           For instance, if the stack starts at absolute address
           0x80000000 and grows downwards, you can use the flags
           -fstack-limit-symbol=__stack_limit and
           -Wl,--defsym,__stack_limit=0x7ffe0000 to enforce a stack
           limit of 128KB.  Note that this may only work with the GNU
           linker.

           You can locally override stack limit checking by using the
           "no_stack_limit" function attribute.

       -fsplit-stack
           Generate code to automatically split the stack before it
           overflows.  The resulting program has a discontiguous stack
           which can only overflow if the program is unable to allocate
           any more memory.  This is most useful when running threaded
           programs, as it is no longer necessary to calculate a good
           stack size to use for each thread.  This is currently only
           implemented for the x86 targets running GNU/Linux.

           When code compiled with -fsplit-stack calls code compiled
           without -fsplit-stack, there may not be much stack space
           available for the latter code to run.  If compiling all code,
           including library code, with -fsplit-stack is not an option,
           then the linker can fix up these calls so that the code
           compiled without -fsplit-stack always has a large stack.
           Support for this is implemented in the gold linker in GNU
           binutils release 2.21 and later.

       -fvtable-verify=[std|preinit|none]
           This option is only available when compiling C++ code.  It
           turns on (or off, if using -fvtable-verify=none) the security
           feature that verifies at run time, for every virtual call,
           that the vtable pointer through which the call is made is
           valid for the type of the object, and has not been corrupted
           or overwritten.  If an invalid vtable pointer is detected at
           run time, an error is reported and execution of the program
           is immediately halted.

           This option causes run-time data structures to be built at
           program startup, which are used for verifying the vtable
           pointers.  The options std and preinit control the timing of
           when these data structures are built.  In both cases the data
           structures are built before execution reaches "main".  Using
           -fvtable-verify=std causes the data structures to be built
           after shared libraries have been loaded and initialized.
           -fvtable-verify=preinit causes them to be built before shared
           libraries have been loaded and initialized.

           If this option appears multiple times in the command line
           with different values specified, none takes highest priority
           over both std and preinit; preinit takes priority over std.

       -fvtv-debug
           When used in conjunction with -fvtable-verify=std or
           -fvtable-verify=preinit, causes debug versions of the runtime
           functions for the vtable verification feature to be called.
           This flag also causes the compiler to log information about
           which vtable pointers it finds for each class.  This
           information is written to a file named vtv_set_ptr_data.log
           in the directory named by the environment variable
           VTV_LOGS_DIR if that is defined or the current working
           directory otherwise.

           Note:  This feature appends data to the log file. If you want
           a fresh log file, be sure to delete any existing one.

       -fvtv-counts
           This is a debugging flag.  When used in conjunction with
           -fvtable-verify=std or -fvtable-verify=preinit, this causes
           the compiler to keep track of the total number of virtual
           calls it encounters and the number of verifications it
           inserts.  It also counts the number of calls to certain run-
           time library functions that it inserts and logs this
           information for each compilation unit.  The compiler writes
           this information to a file named vtv_count_data.log in the
           directory named by the environment variable VTV_LOGS_DIR if
           that is defined or the current working directory otherwise.
           It also counts the size of the vtable pointer sets for each
           class, and writes this information to vtv_class_set_sizes.log
           in the same directory.

           Note:  This feature appends data to the log files.  To get
           fresh log files, be sure to delete any existing ones.

       -finstrument-functions
           Generate instrumentation calls for entry and exit to
           functions.  Just after function entry and just before
           function exit, the following profiling functions are called
           with the address of the current function and its call site.
           (On some platforms, "__builtin_return_address" does not work
           beyond the current function, so the call site information may
           not be available to the profiling functions otherwise.)

                   void __cyg_profile_func_enter (void *this_fn,
                                                  void *call_site);
                   void __cyg_profile_func_exit  (void *this_fn,
                                                  void *call_site);

           The first argument is the address of the start of the current
           function, which may be looked up exactly in the symbol table.

           This instrumentation is also done for functions expanded
           inline in other functions.  The profiling calls indicate
           where, conceptually, the inline function is entered and
           exited.  This means that addressable versions of such
           functions must be available.  If all your uses of a function
           are expanded inline, this may mean an additional expansion of
           code size.  If you use "extern inline" in your C code, an
           addressable version of such functions must be provided.
           (This is normally the case anyway, but if you get lucky and
           the optimizer always expands the functions inline, you might
           have gotten away without providing static copies.)

           A function may be given the attribute
           "no_instrument_function", in which case this instrumentation
           is not done.  This can be used, for example, for the
           profiling functions listed above, high-priority interrupt
           routines, and any functions from which the profiling
           functions cannot safely be called (perhaps signal handlers,
           if the profiling routines generate output or allocate
           memory).

       -finstrument-functions-exclude-file-list=file,file,...
           Set the list of functions that are excluded from
           instrumentation (see the description of
           -finstrument-functions).  If the file that contains a
           function definition matches with one of file, then that
           function is not instrumented.  The match is done on
           substrings: if the file parameter is a substring of the file
           name, it is considered to be a match.

           For example:

                   -finstrument-functions-exclude-file-list=/bits/stl,include/sys

           excludes any inline function defined in files whose pathnames
           contain /bits/stl or include/sys.

           If, for some reason, you want to include letter , in one of
           sym, write ,. For example,
           -finstrument-functions-exclude-file-list=',,tmp' (note the
           single quote surrounding the option).

       -finstrument-functions-exclude-function-list=sym,sym,...
           This is similar to -finstrument-functions-exclude-file-list,
           but this option sets the list of function names to be
           excluded from instrumentation.  The function name to be
           matched is its user-visible name, such as "vector<int>
           blah(const vector<int> &)", not the internal mangled name
           (e.g., "_Z4blahRSt6vectorIiSaIiEE").  The match is done on
           substrings: if the sym parameter is a substring of the
           function name, it is considered to be a match.  For C99 and
           C++ extended identifiers, the function name must be given in
           UTF-8, not using universal character names.

       -fpatchable-function-entry=N[,M]
           Generate N NOPs right at the beginning of each function, with
           the function entry point before the Mth NOP.  If M is
           omitted, it defaults to 0 so the function entry points to the
           address just at the first NOP.  The NOP instructions reserve
           extra space which can be used to patch in any desired
           instrumentation at run time, provided that the code segment
           is writable.  The amount of space is controllable indirectly
           via the number of NOPs; the NOP instruction used corresponds
           to the instruction emitted by the internal GCC back-end
           interface "gen_nop".  This behavior is target-specific and
           may also depend on the architecture variant and/or other
           compilation options.

           For run-time identification, the starting addresses of these
           areas, which correspond to their respective function entries
           minus M, are additionally collected in the
           "__patchable_function_entries" section of the resulting
           binary.

           Note that the value of "__attribute__
           ((patchable_function_entry (N,M)))" takes precedence over
           command-line option -fpatchable-function-entry=N,M.  This can
           be used to increase the area size or to remove it completely
           on a single function.  If "N=0", no pad location is recorded.

           The NOP instructions are inserted at---and maybe before,
           depending on M---the function entry address, even before the
           prologue.