Full Code of hellogcc/100-gcc-tips for AI

master f5f1f6e4433f cached
29 files
69.5 KB
24.2k tokens
5 symbols
1 requests
Download .txt
Repository: hellogcc/100-gcc-tips
Branch: master
Commit: f5f1f6e4433f
Files: 29
Total size: 69.5 KB

Directory structure:
gitextract_fb7pq984/

├── LICENSE
├── README.md
├── build.sh
├── src/
│   ├── address-sanitizer.md
│   ├── cast-lose-precision.md
│   ├── define-macro.md
│   ├── diagnostics-color.md
│   ├── index.md
│   ├── inhibit-linemarkers.md
│   ├── must-emit-function-code.md
│   ├── must-forceinline-function-code.md
│   ├── pack-struct.md
│   ├── pass-options-to-assembler.md
│   ├── pass-options-to-linker.md
│   ├── print-commands-only.md
│   ├── print-file-name.md
│   ├── print-header-search-dir.md
│   ├── print-level-options.md
│   ├── print-predefined-macros.md
│   ├── save-temps.md
│   ├── set-dynamic-linker.md
│   ├── specify-language.md
│   ├── syntax-only.md
│   ├── thread-sanitizer.md
│   ├── turn-on-warnings.md
│   ├── undefine-macro.md
│   ├── verbose-asm.md
│   └── warnings-treated-as-errors.md
└── utils/
    └── build.go

================================================
FILE CONTENTS
================================================

================================================
FILE: LICENSE
================================================

                GNU Free Documentation License
                 Version 1.3, 3 November 2008


 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
     <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.

This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.  It
complements the GNU General Public License, which is a copyleft
license designed for free software.

We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does.  But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book.  We recommend this License
principally for works whose purpose is instruction or reference.


1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License.  Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein.  The "Document", below,
refers to any such manual or work.  Any member of the public is a
licensee, and is addressed as "you".  You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.

A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could fall
directly within that overall subject.  (Thus, if the Document is in
part a textbook of mathematics, a Secondary Section may not explain
any mathematics.)  The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.

The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License.  If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant.  The Document may contain zero
Invariant Sections.  If the Document does not identify any Invariant
Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.  A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters.  A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text.  A copy that is not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification.  Examples of
transparent image formats include PNG, XCF and JPG.  Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page.  For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.

The "publisher" means any person or entity that distributes copies of
the Document to the public.

A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language.  (Here XYZ stands for a
specific section name mentioned below, such as "Acknowledgements",
"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
of such a section when you modify the Document means that it remains a
section "Entitled XYZ" according to this definition.

The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document.  These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.

2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no
other conditions whatsoever to those of this License.  You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute.  However, you may accept
compensation in exchange for copies.  If you distribute a large enough
number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and
you may publicly display copies.


3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover.  Both covers must also clearly and legibly identify
you as the publisher of these copies.  The front cover must present
the full title with all words of the title equally prominent and
visible.  You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.

If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.

It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to
give them a chance to provide you with an updated version of the
Document.


4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it.  In addition, you must do these things in the Modified Version:

A. Use in the Title Page (and on the covers, if any) a title distinct
   from that of the Document, and from those of previous versions
   (which should, if there were any, be listed in the History section
   of the Document).  You may use the same title as a previous version
   if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities
   responsible for authorship of the modifications in the Modified
   Version, together with at least five of the principal authors of the
   Document (all of its principal authors, if it has fewer than five),
   unless they release you from this requirement.
C. State on the Title page the name of the publisher of the
   Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
   adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license notice
   giving the public permission to use the Modified Version under the
   terms of this License, in the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections
   and required Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title, and add
   to it an item stating at least the title, year, new authors, and
   publisher of the Modified Version as given on the Title Page.  If
   there is no section Entitled "History" in the Document, create one
   stating the title, year, authors, and publisher of the Document as
   given on its Title Page, then add an item describing the Modified
   Version as stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for
   public access to a Transparent copy of the Document, and likewise
   the network locations given in the Document for previous versions
   it was based on.  These may be placed in the "History" section.
   You may omit a network location for a work that was published at
   least four years before the Document itself, or if the original
   publisher of the version it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
   Preserve the Title of the section, and preserve in the section all
   the substance and tone of each of the contributor acknowledgements
   and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
   unaltered in their text and in their titles.  Section numbers
   or the equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements".  Such a section
   may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled "Endorsements"
   or to conflict in title with any Invariant Section.
O. Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant.  To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.

You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.

You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version.  Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity.  If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.


5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy.  If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled "History"
in the various original documents, forming one section Entitled
"History"; likewise combine any sections Entitled "Acknowledgements",
and any sections Entitled "Dedications".  You must delete all sections
Entitled "Endorsements".


6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the rules
of this License for verbatim copying of each of the documents in all
other respects.

You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert a
copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that
document.


7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.


8. TRANSLATION

Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections.  You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers.  In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.

If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.


9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.

However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.

Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.


10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the
GNU Free Documentation License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in
detail to address new problems or concerns.  See
http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation.  If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.  If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.

11. RELICENSING

"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works.  A
public wiki that anybody can edit is an example of such a server.  A
"Massive Multiauthor Collaboration" (or "MMC") contained in the site
means any set of copyrightable works thus published on the MMC site.

"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 
license published by Creative Commons Corporation, a not-for-profit 
corporation with a principal place of business in San Francisco, 
California, as well as future copyleft versions of that license 
published by that same organization.

"Incorporate" means to publish or republish a Document, in whole or in 
part, as part of another Document.

An MMC is "eligible for relicensing" if it is licensed under this 
License, and if all works that were first published under this License 
somewhere other than this MMC, and subsequently incorporated in whole or 
in part into the MMC, (1) had no cover texts or invariant sections, and 
(2) were thus incorporated prior to November 1, 2008.

The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.


ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:

    Copyright (c)  YEAR  YOUR NAME.
    Permission is granted to copy, distribute and/or modify this document
    under the terms of the GNU Free Documentation License, Version 1.3
    or any later version published by the Free Software Foundation;
    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
    A copy of the license is included in the section entitled "GNU
    Free Documentation License".

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:

    with the Invariant Sections being LIST THEIR TITLES, with the
    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.

If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.


================================================
FILE: README.md
================================================
# 《100个gcc小技巧》

一个关于gcc使用小技巧的文档。100,在这里可能只是表明很多;具体的数目取决于您的参与和贡献。

## 在线阅读
[开始阅读](<https://github.com/hellogcc/100-gcc-tips/blob/master/src/index.md>)

## 如何参与

直接发PULL REQUEST,或与我们联系。

增加一个小技巧的步骤:

1. 在src目录下新增一个md文件,参照现有文件的格式风格,编写一个小技巧  
markdown语法参见 http://wowubuntu.com/markdown/  
md文件编写可以使用在线所见即所得编辑器 https://www.zybuluo.com/mdeditor
2. 在index.md中为新md文件增加一个索引,可以放到已有分类中,或增加一个分类
3. 如果预览下没有问题,OK!

本地生成html的步骤:

1. 确保[go](http://code.google.com/p/go)和[md2min](https://github.com/fairlyblank/md2min)已经安装并可用
2. 直接运行build.sh
3. 如果顺利,会在html目录下生成所有的html文件

## 联系方式

- [博客网站](http://www.hellogcc.org)
- 在线讨论问题:IRC, freenode, #hellogcc房间
- [邮件列表](http://www.freelists.org/list/hellogcc) (发信需要先订阅)
 
## 版权

本文档版权归贡献者所有。

## 授权许可

本文档使用的是[GNU Free Documentation License](http://www.gnu.org/licenses/fdl.html)。

## 致谢

- 各位参与者

## 其它资源

- [GCC在线手册](https://gcc.gnu.org/onlinedocs/gcc)



================================================
FILE: build.sh
================================================
#!/bin/sh

# This script invokes md2min to convert markdown files to minimal html files,
# using github css. So go and md2min should be available before you run it. 
# See https://github.com/fairlyblank/md2min
# See http://code.google.com/p/go

TOPDIR=`dirname $0`

if [ ! type -P go >/dev/null 2>&1 ]; then
  echo "error: can't find go, which is necessary for building html"
  exit 0
fi

if [ ! type -P md2min >/dev/null 2>&1 ]; then
  echo "error: can't find md2min, which is necessary for building html"
  exit 0
fi

mkdir -p "$TOPDIR/html"

(
export SRC="$TOPDIR/src"
export HTML="$TOPDIR/html"
go run "$TOPDIR/utils/build.go"
)



================================================
FILE: src/address-sanitizer.md
================================================
# 利用Address Sanitizer工具检查内存访问错误

## 例子  
	a.c:
	#include <stdio.h>

	int main(void) {
	        // your code goes here
	        int a[3] = {0};
	        a[3] = 1;
	
	        printf("%d\n", a[3]);
	        return 0;
	}

	b.c:
	#include <stdio.h>
	#include <malloc.h>
	
	int main(void) {
	        int *p = NULL;
	
	        p = malloc(10 * sizeof(int));
	        free(p);
	        *p = 3;
	        return 0;
	}


## 技巧
gcc从`4.8`版本起,集成了`Address Sanitizer`工具,可以用来检查内存访问的错误(编译时指定“`-fsanitize=address`”)。以上面`a.c`程序为例:  

	gcc -fsanitize=address -g -o a a.c
执行`a`程序:  

	[root@localhost nan]# ./a
	=================================================================
	==539==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fff3a152c9c at pc 0x4009b6 bp 0x7fff3a152c60 sp 0x7fff3a152c58
	WRITE of size 4 at 0x7fff3a152c9c thread T0
	    #0 0x4009b5 in main /home/nan/a.c:6
	    #1 0x34e421ed1c in __libc_start_main (/lib64/libc.so.6+0x34e421ed1c)
	    #2 0x4007b8 (/home/nan/a+0x4007b8)
	
	Address 0x7fff3a152c9c is located in stack of thread T0 at offset 44 in frame
	    #0 0x400907 in main /home/nan/a.c:3
	
	  This frame has 1 object(s):
	    [32, 44) 'a' <== Memory access at offset 44 overflows this variable
	HINT: this may be a false positive if your program uses some custom stack unwind mechanism or swapcontext
	      (longjmp and C++ exceptions *are* supported)
	SUMMARY: AddressSanitizer: stack-buffer-overflow /home/nan/a.c:6 main
	Shadow bytes around the buggy address:
	  0x100067422540: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	  0x100067422550: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	  0x100067422560: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	  0x100067422570: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	  0x100067422580: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1
	=>0x100067422590: f1 f1 00[04]f4 f4 f3 f3 f3 f3 00 00 00 00 00 00
	  0x1000674225a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	  0x1000674225b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	  0x1000674225c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	  0x1000674225d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	  0x1000674225e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
	Shadow byte legend (one shadow byte represents 8 application bytes):
	  Addressable:           00
	  Partially addressable: 01 02 03 04 05 06 07
	  Heap left redzone:       fa
	  Heap right redzone:      fb
	  Freed heap region:       fd
	  Stack left redzone:      f1
	  Stack mid redzone:       f2
	  Stack right redzone:     f3
	  Stack partial redzone:   f4
	  Stack after return:      f5
	  Stack use after scope:   f8
	  Global redzone:          f9
	  Global init order:       f6
	  Poisoned by user:        f7
	  Contiguous container OOB:fc
	  ASan internal:           fe
	==539==ABORTING
可以看到,执行程序时检测出了`a`数组的越界访问(`a[3] = 1`)。

再看一下`b`程序:  

	gcc -fsanitize=address -g -o b b.c
执行`b`程序:  

	[root@localhost nan]# ./b
	=================================================================
	==1951==ERROR: AddressSanitizer: heap-use-after-free on address 0x60400000dfd0 at pc 0x4007f9 bp 0x7fff34277bb0 sp 0x7fff34277ba8
	WRITE of size 4 at 0x60400000dfd0 thread T0
	    #0 0x4007f8 in main /home/nan/b.c:9
	    #1 0x34e421ed1c in __libc_start_main (/lib64/libc.so.6+0x34e421ed1c)
	    #2 0x400658 (/home/nan/b+0x400658)
	
	0x60400000dfd0 is located 0 bytes inside of 40-byte region [0x60400000dfd0,0x60400000dff8)
	freed by thread T0 here:
	    #0 0x7fbbb7a7d057 in __interceptor_free /opt/gcc-4.9.2/src/gcc-4.9.2/libsanitizer/asan/asan_malloc_linux.cc:62
	    #1 0x4007c1 in main /home/nan/b.c:8
	    #2 0x34e421ed1c in __libc_start_main (/lib64/libc.so.6+0x34e421ed1c)
	
	previously allocated by thread T0 here:
	    #0 0x7fbbb7a7d26f in __interceptor_malloc /opt/gcc-4.9.2/src/gcc-4.9.2/libsanitizer/asan/asan_malloc_linux.cc:72
	    #1 0x4007b1 in main /home/nan/b.c:7
	    #2 0x34e421ed1c in __libc_start_main (/lib64/libc.so.6+0x34e421ed1c)
	
	SUMMARY: AddressSanitizer: heap-use-after-free /home/nan/b.c:9 main
	Shadow bytes around the buggy address:
	  0x0c087fff9ba0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	  0x0c087fff9bb0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	  0x0c087fff9bc0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	  0x0c087fff9bd0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	  0x0c087fff9be0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	=>0x0c087fff9bf0: fa fa fa fa fa fa fa fa fa fa[fd]fd fd fd fd fa
	  0x0c087fff9c00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	  0x0c087fff9c10: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	  0x0c087fff9c20: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	  0x0c087fff9c30: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	  0x0c087fff9c40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
	Shadow byte legend (one shadow byte represents 8 application bytes):
	  Addressable:           00
	  Partially addressable: 01 02 03 04 05 06 07
	  Heap left redzone:       fa
	  Heap right redzone:      fb
	  Freed heap region:       fd
	  Stack left redzone:      f1
	  Stack mid redzone:       f2
	  Stack right redzone:     f3
	  Stack partial redzone:   f4
	  Stack after return:      f5
	  Stack use after scope:   f8
	  Global redzone:          f9
	  Global init order:       f6
	  Poisoned by user:        f7
	  Contiguous container OOB:fc
	  ASan internal:           fe
	==1951==ABORTING
执行程序时检测出了访问释放内存的错误(`*p = 3`)。  
详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Debugging-Options.html#index-fsanitize_003daddress-593)
## 贡献者
nanxiao

================================================
FILE: src/cast-lose-precision.md
================================================
# error: cast from ... to ... loses precision

## 例子

	#include <iostream>
	
	class Foo {
	 public:
	  void print() const {
	    std::cout << (int)(this) << "\n";
	  }
	};
	
	int main()
	{
	  class Foo foo;
	
	  foo.print();
	  return 0;
	}

## 技巧

在g++编译上面的例子,会报如下错误:

	$ g++ foo.cc 
	foo.cc: In member function ‘void Foo::print() const’:
	foo.cc:6:28: error: cast from ‘const Foo*’ to ‘int’ loses precision [-fpermissive]

这是一个强制类型转换的错误,你可以修改源代码为:

	std::cout << (int*)(this) << "\n";

即可。

如果,你不想(或不能)去修改源程序,只是应为升级了gcc而带来了这样的错误,那么也可以使用`-fpermissive`选项,将错误降低为警告:

	$ g++ foo.cc -fpermissive
	foo.cc: In member function ‘void Foo::print() const’:
	foo.cc:6:28: warning: cast from ‘const Foo*’ to ‘int’ loses precision [-fpermissive]

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html#index-fpermissive-166)

## 贡献者

xmj



================================================
FILE: src/define-macro.md
================================================
# 在命令行中预定义宏

## 例子

	#include <stdio.h>
	
	int main (void)
	{
	  int i, sum;
	
	  for (i = 1, sum = 0; i <= 10; i++)
	    {
	      sum += i;
	    #ifdef DEBUG
	      printf ("sum += %d is %d\n", i, sum);
	    #endif
	    }
	  printf ("total sum is %d\n", sum);
	
	  return 0;
	}

## 技巧

使用`-D`选项可以在命令行中预定义一个宏,比如:

	$ gcc -D DEBUG macro.c

中间可以没有空格:

	$ gcc -DDEBUG macro.c

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options)

## 贡献者

xmj



================================================
FILE: src/diagnostics-color.md
================================================
# 打印彩色诊断信息

## 技巧

这是gcc-4.9新增的功能,可以通过定义环境变量`GCC_COLORS`来彩色打印诊断信息。

也可以使用选项`-fdiagnostics-color`来设定。

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Language-Independent-Options.html#Language-Independent-Options)

## 贡献者

xmj



================================================
FILE: src/index.md
================================================
# 信息显示
* [打印gcc预定义的宏信息](print-predefined-macros.md)
* [打印gcc执行的子命令](print-commands-only.md)
* [打印优化级别的对应选项](print-level-options.md)
* [打印彩色诊断信息](diagnostics-color.md)
* [打印头文件搜索路径](print-header-search-dir.md)
* [打印连接库的具体路径](print-file-name.md)

# 预处理
* [生成没有行号标记的预处理文件](inhibit-linemarkers.md)
* [在命令行中预定义宏](define-macro.md)
* [在命令行中取消宏定义](undefine-macro.md)

# 汇编
* [把选项传给汇编器](pass-options-to-assembler.md)
* [生成有详细信息的汇编文件](verbose-asm.md)

# 调试
* [利用Address Sanitizer工具检查内存访问错误](address-sanitizer.md)
* [利用Thread Sanitizer工具检查数据竞争的问题](thread-sanitizer.md)

# 连接
* [把选项传给连接器](pass-options-to-linker.md)
* [设置动态连接器](set-dynamic-linker.md)

# 函数属性
* [禁止函数被优化掉](must-emit-function-code.md)
* [强制函数inline](must-forceinline-function-code.md)

# 常见错误
* [error: cast from ... to ... loses precision](cast-lose-precision.md)
* [all warnings being treated as errors](warnings-treated-as-errors.md)
* [gdb无法调试gcc编译的程序](specify-dwarf-version.md)

# 其它
* [只做语法检查](syntax-only.md)
* [保存临时文件](save-temps.md)
* [打开警告信息](turn-on-warnings.md)
* [指定语言类型](specify-language.md)
* [改变结构体成员的字节对齐](pack-struct.md)



================================================
FILE: src/inhibit-linemarkers.md
================================================
# 生成没有行号标记的预处理文件

## 技巧

有时编译程序会遇到如下类似的错误,

	In file included from foo.c:15,
	from a.h:45,
	b.h:53: error: ... ...

如果错误是由于你所定义的一个很复杂的宏所引起的,你可能会需要先手动编译生成相应的预处理文件,查看下预处理文件中的宏扩展代码。比如,先运行

	gcc -E foo.c -o foo.i

来生成foo.i预处理文件。然后,还可以尝试手动修改、编译这个预处理文件。

但是,由于生成的预处理文件中含有行号标记(linemarker),所以,运行

	gcc -c foo.i -o foo.o

所得到的错误行号信息还是跟最初的一样,如果可以将预处理文件中的行号标记都去掉,似乎会有些帮助。

幸好,gcc提供了这个选项:

> -P
> Inhibit generation of linemarkers in the output from the
> preprocessor. This might be useful when running the preprocessor on
> something that is not C code, and will be sent to a program which
> might be confused by the linemarkers.

运行

	gcc -E -P foo.c -o foo.i

即可。

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options)

## 贡献者

xmj



================================================
FILE: src/must-emit-function-code.md
================================================
# 禁止函数被优化掉

## 例子

	#if (GCC_VERSION > 4000)
	#define DEBUG_FUNCTION __attribute__ ((__used__))
	#define DEBUG_VARIABLE __attribute__ ((__used__))
	#else 
	#define DEBUG_FUNCTION
	#define DEBUG_VARIABLE
	#endif
	
	DEBUG_FUNCTION void
	debug_bb (basic_block bb)
	{
	  dump_bb (bb, stderr, 0);
	}

## 技巧

上面的例子是gcc的源码。使用gcc的扩展功能——函数属性`__attribute__ ((__used__))`,可以指定该函数是有用的,不能被优化掉。

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes)

## 贡献者

xmj



================================================
FILE: src/must-forceinline-function-code.md
================================================
# 强制函数永远以inline的形式调用

## 例子

	#if defined(__GNUC__)
	#define FORCEDINLINE  __attribute__((always_inline))
	#else 
	#define FORCEDINLINE
	#endif
	
	FORCEDINLINE int add(int a,int b)
	{
	  return a+b;
	}

## 技巧

上面的例子是gcc的源码。使用gcc的扩展功能——函数属性`__attribute__ ((always_inline))`,可以指定该函数永远以inline的形式调用

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Inline.html)

## 贡献者

mengke


================================================
FILE: src/pack-struct.md
================================================
# 改变结构体成员的字节对齐

## 例子  
	#include <stdio.h>

	typedef struct
	{
			char a;
			int b;
	} ST_A;

	int main(void)
	{
			printf("sizeof(ST_A)=%ld\n",sizeof(ST_A));
	}
## 技巧
在上面的程序里,`ST_A`结构体的内存布局默认是这样的:
<table>
   <tr>
      <td>Offset</td>
      <td>1byte</td>
      <td>1byte</td>
      <td>1byte</td>
      <td>1byte</td>
   </tr>
   <tr>
      <td>0</td>
      <td>a</td>
      <td>填充字节</td>
      <td>填充字节</td>
	  <td>填充字节</td>
   </tr>
   <tr>
      <td>4</td>
      <td>b</td>
      <td>b</td>
      <td>b</td>
	  <td>b</td>
   </tr>
</table>

编译执行,结果如下:	

    root@ubuntu:~$ gcc -g -o a a.c
	root@ubuntu:~$ ./a
	sizeof(ST_A)=8



使用gcc的"`-fpack-struct[=n]`"选项(“`n`”需要为`2`的倍数)可以改变成员的地址对齐。例如指定“`n=2`”时,将标明结构体成员的最大对齐地址为2。这样`ST_A`结构体中的成员`b`的地址将不再按照`4`字节对齐,内存布局变为:
<table>
   <tr>
      <td>Offset</td>
      <td>1byte</td>
      <td>1byte</td>
      <td>1byte</td>
      <td>1byte</td>
   </tr>
   <tr>
      <td>0</td>
      <td>a</td>
      <td>填充字节</td>
      <td>b</td>
	  <td>b</td>
   </tr>
   <tr>
      <td>4</td>
      <td>b</td>
      <td>b</td>
      <td></td>
	  <td></td>
   </tr>
</table>
编译执行,结果如下:	

    root@ubuntu:~$ gcc -g -fpack-struct=2 -o a a.c
	root@ubuntu:~$ ./a
	sizeof(ST_A)=6

当不指定“`n`”时,将没有填充字节,所有成员将一个挨着一个排在一起:
<table>
   <tr>
      <td>Offset</td>
      <td>1byte</td>
      <td>1byte</td>
      <td>1byte</td>
      <td>1byte</td>
   </tr>
   <tr>
      <td>0</td>
      <td>a</td>
      <td>b</td>
      <td>b</td>
	  <td>b</td>
   </tr>
   <tr>
      <td>4</td>
      <td>b</td>
      <td></td>
      <td></td>
	  <td></td>
   </tr>
</table>
编译执行,结果如下:	

    root@ubuntu:~$ gcc -g -fpack-struct -o a a.c
	root@ubuntu:~$ ./a
	sizeof(ST_A)=5
由于这个编译选项会导致ABI(Application Binary Interface)的改变,所以使用时一定要谨慎。
详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html)
## 贡献者
nanxiao

================================================
FILE: src/pass-options-to-assembler.md
================================================
# 把选项传给汇编器

## 例子

	#include <stdio.h>
	
	int main(void)
	{
	  int i;
	
	  for (i = 0; i < 10; i++)
	    printf("%d ", i);
	  putchar ('\n');
	
	  return 0;
	}

## 技巧

使用`-Wa,option`可以将选项`option`传递给汇编器。

注意,逗号和选项之间不能有空格。例如:

	$ gcc -c -Wa,-L foo.c
	$ objdump -d foo.o
	
	foo.o:     file format elf64-x86-64
	
	
	Disassembly of section .text:
	
	0000000000000000 <main>:
	   0:   55                      push   %rbp
	   1:   48 89 e5                mov    %rsp,%rbp
	   4:   48 83 ec 10             sub    $0x10,%rsp
	   8:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
	   f:   eb 1b                   jmp    2c <.L2>
	
	0000000000000011 <.L3>:
	  11:   b8 00 00 00 00          mov    $0x0,%eax
	  16:   8b 55 fc                mov    -0x4(%rbp),%edx
	  19:   89 d6                   mov    %edx,%esi
	  1b:   48 89 c7                mov    %rax,%rdi
	  1e:   b8 00 00 00 00          mov    $0x0,%eax
	  23:   e8 00 00 00 00          callq  28 <.L3+0x17>
	  28:   83 45 fc 01             addl   $0x1,-0x4(%rbp)
	
	000000000000002c <.L2>:
	  2c:   83 7d fc 09             cmpl   $0x9,-0x4(%rbp)
	  30:   7e df                   jle    11 <.L3>
	  32:   bf 0a 00 00 00          mov    $0xa,%edi
	  37:   e8 00 00 00 00          callq  3c <.L2+0x10>
	  3c:   b8 00 00 00 00          mov    $0x0,%eax
	  41:   c9                      leaveq 
	  42:   c3                      retq 

这里的`-L`是汇编器as的选项,用于在目标文件中保留局部符号(local symbol)。可以看到,反汇编代码中给出了每个局部符号。

如果此时你使用`oprofile`来统计性能事件,那么获得的结果将不是以函数为单位了,而是以这些符号所划分的代码块为单位。

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Assembler-Options.html#Assembler-Options)和[as手册](https://sourceware.org/binutils/docs-2.24/as/L.html#L)

## 贡献者

xmj



================================================
FILE: src/pass-options-to-linker.md
================================================
# 把选项传给连接器

## 例子

	#include <stdio.h>
	
	int main (void)
	{
	  puts ("Hello world!");
	  return 0;
	}

## 技巧

使用`-Wl,option`可以将选项`option`传递给连接器。

注意,逗号和选项之间不能有空格。一种常见用法,就是让连接器生成内存映射文件,例如:

	$ gcc -Wl,-Map=output.map foo.c
	$ cat output.map
	Archive member included because of file (symbol)
	
	/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
	                              /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o (__libc_csu_init)
	
	Discarded input sections
	
	 .note.GNU-stack
	                0x0000000000000000        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
	 .gnu_debuglink
	                0x0000000000000000        0xc /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
	 .note.GNU-stack
	                0x0000000000000000        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
	 .gnu_debuglink
	                0x0000000000000000        0xc /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
	 .note.GNU-stack
	                0x0000000000000000        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	 .note.GNU-stack
	                0x0000000000000000        0x0 /tmp/ccBOhdmq.o
	 .note.GNU-stack
	                0x0000000000000000        0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
	 .note.GNU-stack
	                0x0000000000000000        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	 .note.GNU-stack
	                0x0000000000000000        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
	 .gnu_debuglink
	                0x0000000000000000        0xc /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
	
	Memory map
	
	 ** file header
	                0x0000000000400000       0x40
	 ** segment headers
	                0x0000000000400040      0x1f8
	
	.interp         0x0000000000400238       0x1c
	 ** fill        0x0000000000400238       0x1c
	
	.note.ABI-tag   0x0000000000400254       0x20
	 .note.ABI-tag  0x0000000000400254       0x20 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
	
	.note.gnu.build-id
	                0x0000000000400274       0x24
	 ** note header
	                0x0000000000400274       0x10
	 ** zero fill   0x0000000000400284       0x14
	
	.dynsym         0x0000000000400298       0x78
	 ** dynsym      0x0000000000400298       0x78
	
	.dynstr         0x0000000000400310       0x51
	 ** string table
	                0x0000000000400310       0x51
	
	.gnu.hash       0x0000000000400368       0x1c
	 ** hash        0x0000000000400368       0x1c
	
	.gnu.version    0x0000000000400384        0xa
	 ** versions    0x0000000000400384        0xa
	
	.gnu.version_r  0x0000000000400390       0x20
	 ** version refs
	                0x0000000000400390       0x20
	
	.rela.dyn       0x00000000004003b0       0x18
	 ** dynamic relocs
	                0x00000000004003b0       0x18
	
	.rela.plt       0x00000000004003c8       0x30
	 ** dynamic relocs
	                0x00000000004003c8       0x30
	
	.init           0x00000000004003f8       0x18
	 .init          0x00000000004003f8        0x9 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
	                0x00000000004003f8                _init
	 .init          0x0000000000400401        0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	 .init          0x0000000000400406        0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	 .init          0x000000000040040b        0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
	
	.plt            0x0000000000400410       0x30
	 ** PLT         0x0000000000400410       0x30
	
	.text           0x0000000000400440      0x1d8
	 .text          0x0000000000400440       0x2c /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
	                0x0000000000400440                _start
	 .text          0x000000000040046c       0x17 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
	 ** fill        0x0000000000400483        0xd
	 .text          0x0000000000400490       0x92 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	 .text          0x0000000000400522       0x15 /tmp/ccBOhdmq.o
	                0x0000000000400522                main
	 ** fill        0x0000000000400537        0x9
	 .text          0x0000000000400540       0x92 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
	                0x0000000000400540                __libc_csu_init
	                0x00000000004005d0                __libc_csu_fini
	 ** fill        0x00000000004005d2        0xe
	 .text          0x00000000004005e0       0x36 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	 ** fill        0x0000000000400616        0x2
	 .text          0x0000000000400618        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
	
	.fini           0x0000000000400618        0xe
	 .fini          0x0000000000400618        0x4 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
	                0x0000000000400618                _fini
	 .fini          0x000000000040061c        0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	 .fini          0x0000000000400621        0x5 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
	
	.rodata         0x0000000000400628       0x11
	 ** merge constants
	                0x0000000000400628        0x4
	 .rodata        0x000000000040062c        0xd /tmp/ccBOhdmq.o
	
	.eh_frame       0x0000000000400640       0xa4
	 ** eh_frame    0x0000000000400640       0xa0
	 .eh_frame      0x00000000004006e0        0x4 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	
	.eh_frame_hdr   0x00000000004006e4       0x2c
	 ** eh_frame_hdr
	                0x00000000004006e4       0x2c
	
	.ctors          0x0000000000401e28       0x10
	 .ctors         0x0000000000401e28        0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	 .ctors         0x0000000000401e30        0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	
	.dtors          0x0000000000401e38       0x10
	 .dtors         0x0000000000401e38        0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	 .dtors         0x0000000000401e40        0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	                0x0000000000401e40                __DTOR_END__
	
	.jcr            0x0000000000401e48        0x8
	 .jcr           0x0000000000401e48        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	 .jcr           0x0000000000401e48        0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	
	.dynamic        0x0000000000401e50      0x190
	 ** dynamic     0x0000000000401e50      0x190
	
	.got            0x0000000000401fe0        0x8
	 ** GOT         0x0000000000401fe0        0x8
	
	.got.plt        0x0000000000401fe8       0x28
	 ** GOT PLT     0x0000000000401fe8       0x28
	 ** GOT IRELATIVE PLT
	                0x0000000000402010        0x0
	 ** GOT         0x0000000000402010        0x0
	
	.data           0x0000000000402010       0x10
	 .data          0x0000000000402010        0x4 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
	                0x0000000000402010                data_start
	                0x0000000000402010                __data_start
	 .data          0x0000000000402014        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
	 .data          0x0000000000402018        0x8 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	                0x0000000000402018                __dso_handle
	 .data          0x0000000000402020        0x0 /tmp/ccBOhdmq.o
	 .data          0x0000000000402020        0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
	 .data          0x0000000000402020        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	 .data          0x0000000000402020        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
	
	.bss            0x0000000000402020       0x10
	 .bss           0x0000000000402020        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
	 .bss           0x0000000000402020        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
	 .bss           0x0000000000402020       0x10 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
	 .bss           0x0000000000402030        0x0 /tmp/ccBOhdmq.o
	 .bss           0x0000000000402030        0x0 /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
	 .bss           0x0000000000402030        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
	 .bss           0x0000000000402030        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
	
	.comment        0x0000000000000000       0x2b
	 ** merge strings
	                0x0000000000000000       0x2b
	
	.note.gnu.gold-version
	                0x0000000000000000       0x1c
	 ** note header
	                0x0000000000000000       0x10
	 ** fill        0x0000000000000010        0x9
	 ** zero fill   0x0000000000000019        0x3
	
	.symtab         0x0000000000000000      0x390
	 ** symtab      0x0000000000000000      0x390
	
	.strtab         0x0000000000000000      0x1d5
	 ** string table
	                0x0000000000000000      0x1d5
	
	.shstrtab       0x0000000000000000      0x115
	 ** string table
	                0x0000000000000000      0x115
	
详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options)

## 贡献者

xmj



================================================
FILE: src/print-commands-only.md
================================================
# 打印gcc执行的子命令

## 例子

	$ gcc -### foo.c
	Using built-in specs.
	COLLECT_GCC=gcc
	COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
	Target: x86_64-linux-gnu
	Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
	Thread model: posix
	gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 
	COLLECT_GCC_OPTIONS='-mtune=generic' '-march=x86-64'
	 /usr/lib/gcc/x86_64-linux-gnu/4.6/cc1 -quiet -imultilib . -imultiarch x86_64-linux-gnu foo.c -quiet -dumpbase foo.c "-mtune=generic" "-march=x86-64" -auxbase foo -fstack-protector -o /tmp/ccezMraJ.s
	COLLECT_GCC_OPTIONS='-mtune=generic' '-march=x86-64'
	 as --64 -o /tmp/cc9Ce7IE.o /tmp/ccezMraJ.s
	COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/
	LIBRARY_PATH=/home/xmj/install/cap-llvm-3.4/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/home/xmj/install/cap-llvm-3.4/lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../:/lib/:/usr/lib/
	COLLECT_GCC_OPTIONS='-mtune=generic' '-march=x86-64'
	 /usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 "--sysroot=/" --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_x86_64 "--hash-style=gnu" -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/home/xmj/install/cap-llvm-3.4/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/home/xmj/install/cap-llvm-3.4/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. /tmp/cc9Ce7IE.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o

## 技巧

如上所示,使用`-###`选项可以打印出gcc所执行的各个子命令,分别为,

cc1:

	 /usr/lib/gcc/x86_64-linux-gnu/4.6/cc1 -quiet -imultilib . -imultiarch x86_64-linux-gnu foo.c -quiet -dumpbase foo.c "-mtune=generic" "-march=x86-64" -auxbase foo -fstack-protector -o /tmp/ccezMraJ.s

as:

	 as --64 -o /tmp/cc9Ce7IE.o /tmp/ccezMraJ.s

collect2:

	 /usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 "--sysroot=/" --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_x86_64 "--hash-style=gnu" -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/home/xmj/install/cap-llvm-3.4/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/home/xmj/install/cap-llvm-3.4/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. /tmp/cc9Ce7IE.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o

这个跟使用`-v`所显示的内容差不多,区别在于使用`-###`是只打印,不实际执行具体的命令。手册里提到,它的一种用法,就是在脚本里使用这个选项,来获得gcc所调用的各个子命令行。


详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#Overall-Options)

## 贡献者

xmj



================================================
FILE: src/print-file-name.md
================================================
# 打印连接库的具体路径

## 例子

	$ gcc -print-file-name=libc.a
	/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.a

## 技巧

如上所示,使用`-print-file-name`选项就可以显示出gcc究竟会连接哪个libc库了。

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html#index-print-file-name)

## 贡献者

xmj



================================================
FILE: src/print-header-search-dir.md
================================================
# 打印头文件搜索路径

## 例子

	$ gcc -v foo.c
	...
	ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
	ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/include"
	#include "..." search starts here:
	#include <...> search starts here:
	 /usr/lib/gcc/x86_64-linux-gnu/4.6/include
	 /usr/local/include
	 /usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed
	 /usr/include/x86_64-linux-gnu
	 /usr/include
	End of search list.
	...

## 技巧

如上所示,使用`-v`选项可以打印出gcc搜索头文件的路径和顺序。当然,也可以使用`-###`选项

## 贡献者

xmj



================================================
FILE: src/print-level-options.md
================================================
# 打印优化级别的对应选项

## 例子

	$ gcc -Q --help=optimizers
	The following options control optimizations:
	  -O<number>                  		
	  -Ofast                      		
	  -Os                         		
	  -falign-functions           		[disabled]
	  -falign-jumps               		[disabled]
	  -falign-labels              		[disabled]
	  -falign-loops               		[disabled]
	  -fasynchronous-unwind-tables 		[enabled]
	  -fbranch-count-reg          		[enabled]
	  -fbranch-probabilities      		[disabled]
	  -fbranch-target-load-optimize 	[disabled]
	  -fbranch-target-load-optimize2 	[disabled]
	  -fbtr-bb-exclusive          		[disabled]
	  -fcaller-saves              		[disabled]
	  -fcombine-stack-adjustments 		[disabled]
	  -fcommon                    		[enabled]
	  -fcompare-elim              		[disabled]
	  -fconserve-stack            		[disabled]
	  -fcprop-registers           		[disabled]
	  -fcrossjumping              		[disabled]
	  -fcse-follow-jumps          		[disabled]
	  -fcx-fortran-rules          		[disabled]
	  -fcx-limited-range          		[disabled]
	  -fdata-sections             		[disabled]
	  -fdce                       		[enabled]
	  -fdefer-pop                 		[disabled]
	  -fdelayed-branch            		[disabled]
	  -fdelete-null-pointer-checks 		[enabled]
	  -fdevirtualize              		[disabled]
	  -fdse                       		[enabled]
	  -fearly-inlining            		[enabled]
	  -fexceptions                		[disabled]
	  -fexpensive-optimizations   		[disabled]
	  -ffinite-math-only          		[disabled]
	  -ffloat-store               		[disabled]
	  -fforward-propagate         		[disabled]
	  -fgcse                      		[disabled]
	  -fgcse-after-reload         		[disabled]
	  -fgcse-las                  		[disabled]
	  -fgcse-lm                   		[enabled]
	  -fgcse-sm                   		[disabled]
	  -fgraphite-identity         		[disabled]
	  -fguess-branch-probability  		[disabled]
	  -fhandle-exceptions         		
	  -fif-conversion             		[disabled]
	  -fif-conversion2            		[disabled]
	  -finline-functions          		[disabled]
	  -finline-functions-called-once 	[enabled]
	  -finline-small-functions    		[disabled]
	  -fipa-cp                    		[disabled]
	  -fipa-cp-clone              		[disabled]
	  -fipa-matrix-reorg          		[disabled]
	  -fipa-profile               		[disabled]
	  -fipa-pta                   		[disabled]
	  -fipa-pure-const            		[disabled]
	  -fipa-reference             		[disabled]
	  -fipa-sra                   		[disabled]
	  -fivopts                    		[enabled]
	  -fjump-tables               		[enabled]
	  -floop-block                		[disabled]
	  -floop-flatten              		[disabled]
	  -floop-interchange          		[disabled]
	  -floop-parallelize-all      		[disabled]
	  -floop-strip-mine           		[disabled]
	  -flto-report                		[disabled]
	  -fltrans                    		[disabled]
	  -fmath-errno                		[enabled]
	  -fmerge-all-constants       		[disabled]
	  -fmerge-constants           		[disabled]
	  -fmodulo-sched              		[disabled]
	  -fmove-loop-invariants      		[enabled]
	  -fnon-call-exceptions       		[disabled]
	  -fnothrow-opt               		[disabled]
	  -fomit-frame-pointer        		[disabled]
	  -foptimize-register-move    		[disabled]
	  -foptimize-sibling-calls    		[disabled]
	  -fpack-struct               		[disabled]
	  -fpack-struct=<number>      		
	  -fpeel-loops                		[disabled]
	  -fpeephole                  		[enabled]
	  -fpeephole2                 		[disabled]
	  -fpredictive-commoning      		[disabled]
	  -fprefetch-loop-arrays      		[enabled]
	  -freg-struct-return         		[disabled]
	  -fregmove                   		[disabled]
	  -frename-registers          		[enabled]
	  -freorder-blocks            		[disabled]
	  -freorder-blocks-and-partition 	[disabled]
	  -freorder-functions         		[disabled]
	  -frerun-cse-after-loop      		[disabled]
	  -freschedule-modulo-scheduled-loops 	[disabled]
	  -frounding-math             		[disabled]
	  -frtti                      		[enabled]
	  -fsched-critical-path-heuristic 	[enabled]
	  -fsched-dep-count-heuristic 		[enabled]
	  -fsched-group-heuristic     		[enabled]
	  -fsched-interblock          		[enabled]
	  -fsched-last-insn-heuristic 		[enabled]
	  -fsched-pressure            		[disabled]
	  -fsched-rank-heuristic      		[enabled]
	  -fsched-spec                		[enabled]
	  -fsched-spec-insn-heuristic 		[enabled]
	  -fsched-spec-load           		[disabled]
	  -fsched-spec-load-dangerous 		[disabled]
	  -fsched-stalled-insns       		[disabled]
	  -fsched-stalled-insns-dep   		[enabled]
	  -fsched2-use-superblocks    		[disabled]
	  -fschedule-insns            		[disabled]
	  -fschedule-insns2           		[disabled]
	  -fsection-anchors           		[disabled]
	  -fsel-sched-pipelining      		[disabled]
	  -fsel-sched-pipelining-outer-loops 	[disabled]
	  -fsel-sched-reschedule-pipelined 	[disabled]
	  -fselective-scheduling      		[disabled]
	  -fselective-scheduling2     		[disabled]
	  -fshort-double              		[disabled]
	  -fshort-enums               		[enabled]
	  -fshort-wchar               		[disabled]
	  -fsignaling-nans            		[disabled]
	  -fsigned-zeros              		[enabled]
	  -fsingle-precision-constant 		[disabled]
	  -fsplit-ivs-in-unroller     		[enabled]
	  -fsplit-wide-types          		[disabled]
	  -fstrict-aliasing           		[disabled]
	  -fstrict-enums              		[disabled]
	  -fthread-jumps              		[disabled]
	  -fno-threadsafe-statics     		[enabled]
	  -ftoplevel-reorder          		[enabled]
	  -ftrapping-math             		[enabled]
	  -ftrapv                     		[disabled]
	  -ftree-bit-ccp              		[disabled]
	  -ftree-builtin-call-dce     		[disabled]
	  -ftree-ccp                  		[disabled]
	  -ftree-ch                   		[disabled]
	  -ftree-copy-prop            		[disabled]
	  -ftree-copyrename           		[disabled]
	  -ftree-cselim               		[enabled]
	  -ftree-dce                  		[disabled]
	  -ftree-dominator-opts       		[disabled]
	  -ftree-dse                  		[disabled]
	  -ftree-forwprop             		[enabled]
	  -ftree-fre                  		[disabled]
	  -ftree-loop-distribute-patterns 	[disabled]
	  -ftree-loop-distribution    		[disabled]
	  -ftree-loop-if-convert      		[enabled]
	  -ftree-loop-if-convert-stores 	[disabled]
	  -ftree-loop-im              		[enabled]
	  -ftree-loop-ivcanon         		[enabled]
	  -ftree-loop-optimize        		[enabled]
	  -ftree-lrs                  		[disabled]
	  -ftree-phiprop              		[enabled]
	  -ftree-pre                  		[disabled]
	  -ftree-pta                  		[enabled]
	  -ftree-reassoc              		[enabled]
	  -ftree-scev-cprop           		[enabled]
	  -ftree-sink                 		[disabled]
	  -ftree-slp-vectorize        		[enabled]
	  -ftree-sra                  		[disabled]
	  -ftree-switch-conversion    		[disabled]
	  -ftree-ter                  		[disabled]
	  -ftree-vect-loop-version    		[enabled]
	  -ftree-vectorize            		[disabled]
	  -ftree-vrp                  		[disabled]
	  -funit-at-a-time            		[enabled]
	  -funroll-all-loops          		[disabled]
	  -funroll-loops              		[disabled]
	  -funsafe-loop-optimizations 		[disabled]
	  -funsafe-math-optimizations 		[disabled]
	  -funswitch-loops            		[disabled]
	  -funwind-tables             		[disabled]
	  -fvar-tracking              		[enabled]
	  -fvar-tracking-assignments  		[enabled]
	  -fvar-tracking-assignments-toggle 	[disabled]
	  -fvar-tracking-uninit       		[disabled]
	  -fvariable-expansion-in-unroller 	[disabled]
	  -fvect-cost-model           		[enabled]
	  -fvpt                       		[disabled]
	  -fweb                       		[enabled]
	  -fwhole-program             		[disabled]
	  -fwpa                       		[disabled]
	  -fwrapv                     		[disabled]

## 技巧

如上所示,使用`-Q --help=optimizers`选项可以打印出gcc的所有优化(相关的)选项,以及缺省情况下它们是否打开。类似的,你也可以查看不同优化级别下,这些优化选项是否打开:

	$ gcc -Q --help=optimizers -O
	$ gcc -Q --help=optimizers -O1
	$ gcc -Q --help=optimizers -O2
	$ gcc -Q --help=optimizers -O3
	$ gcc -Q --help=optimizers -Og
	$ gcc -Q --help=optimizers -Os
	$ gcc -Q --help=optimizers -Ofast

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#Overall-Options)

## 贡献者

xmj



================================================
FILE: src/print-predefined-macros.md
================================================
# 打印gcc预定义的宏信息

## 例子

	[root@linux:~]$ gcc -dM -E - < /dev/null
	#define __DBL_MIN_EXP__ (-1021)
	#define __FLT_MIN__ 1.17549435e-38F
	#define __CHAR_BIT__ 8
	#define __WCHAR_MAX__ 2147483647
	#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
	#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
	#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
	#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
	#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
	#define __FLT_EVAL_METHOD__ 0
	#define __unix__ 1
	#define __x86_64 1
	#define __DBL_MIN_10_EXP__ (-307)
	#define __FINITE_MATH_ONLY__ 0
	#define __GNUC_PATCHLEVEL__ 7


## 技巧

如上所示,使用“`gcc -dM -E - < /dev/null`”命令就可以显示出gcc预定义的宏信息。“`-dM`”生成预定义的宏信息,“`-E`”表示预处理操作完成后就停止,不再进行下面的操作。此外,也可以使用这个命令:“`echo | gcc -dM -E -`”。


详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#index-dM-908)

## 贡献者

nanxiao



================================================
FILE: src/save-temps.md
================================================
# 保存临时文件

## 例子

	$ gcc -save-temps a/foo.c
	$ ls foo.*
	foo.c  foo.i  foo.o  foo.s

	$ gcc -save-temps=obj a/foo.c -o a/foo
	$ ls a
	foo  foo.c  foo.i  foo.o  foo.s

## 技巧

如上所示,使用选项`-save-temps`可以保存gcc运行过程中生成的临时文件。这些中间文件的名字是基于源文件而来,并且保存在当前目录下。

如果你在不同目录下有重名的源文件,那么中间文件就会有冲突了。此时,你可以使用`-save-temps=obj`来指定中间文件名基于目标文件而定,并保存在目标文件所在目录下。

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options)

## 贡献者

xmj



================================================
FILE: src/set-dynamic-linker.md
================================================
# 设置动态连接器

## 技巧

有人问我,如何通过选项来指定动态连接器,而不使用缺省系统自带的动态连接器。我后来查了下ld的手册,有这么一个选项:

	-Ifile
	--dynamic-linker=file     
	    Set the name of the dynamic linker. This is only meaningful when generating dynamically linked ELF executables. The default dynamic linker is normally correct; don't use this unless you know what you are doing.

看起来,可以通过如下方式来完成:

	$ gcc foo.c -Wl,-I/home/xmj/tmp/ld-2.15.so
	$ ldd a.out
	linux-vdso.so.1 =>  (0x00007fffce5fe000)
	/usr/local/lib/libtrash.so (0x00007f1980477000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f19800a3000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f197fe9e000)
	/home/xmj/tmp/ld-2.15.so => /lib64/ld-linux-x86-64.so.2 (0x00007f1980485000)

注意,tmp目录下的动态连接器因为也是动态连接的,所以它本身是依赖系统缺省的动态连接器。

详情参见[ld手册](https://sourceware.org/binutils/docs-2.24/ld/Options.html#Options)

## 贡献者

xmj



================================================
FILE: src/specify-language.md
================================================
# 指定语言类型

## 技巧

gcc是通过文件名后缀来判断源代码语言类型的。

如果你从标准输入把源码传给gcc,那么就需要通过`-x`选项显式的指定语言类型:

	$ echo "int x;" | gcc -S -x c -
	$ cat ./-.s
		.file	""
		.comm	x,4,4
		.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
		.section	.note.GNU-stack,"",@progbits

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#Overall-Options)

## 贡献者

xmj



================================================
FILE: src/syntax-only.md
================================================
# 只做语法检查

## 例子

	$ cat foo.c
	union u {
	  char c;
	  int i;
	}
	$ gcc -fsyntax-only foo.c
	foo.c:4:1: error: expected identifier or ‘(’ at end of input

## 技巧

如上所示,使用`-fsyntax-only`选项可以只做语法检查,不进行实际的编译输出。

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-fsyntax-only-274)

## 贡献者

xmj



================================================
FILE: src/thread-sanitizer.md
================================================
# 利用Thread Sanitizer工具检查数据竞争的问题

## 例子  
	#include <pthread.h>
	int Global;
	void *Thread1(void *x) {
	  Global = 42;
	  return x;
	}
	int main(void) {
	  pthread_t t;
	  pthread_create(&t, NULL, Thread1, NULL);
	  Global = 43;
	  pthread_join(t, NULL);
	  return Global;
	}



## 技巧
gcc从`4.8`版本起,集成了`Address Sanitizer`工具,可以用来检查数据竞争的问题(编译时指定“`-fsanitize=thread -fPIE -pie`”)。以上面程序为例:  

	gcc -fsanitize=thread -fPIE -pie -g -o a a.c -lpthread

执行`a`程序:  

	[root@localhost nan]# ./a
	==================
	WARNING: ThreadSanitizer: data race (pid=14545)
	  Write of size 4 at 0x7f055b4802b0 by thread T1:
		#0 Thread1 /home/nan/a.c:4 (a+0x000000000a87)

	  Previous write of size 4 at 0x7f055b4802b0 by main thread:
		#0 main /home/nan/a.c:10 (a+0x000000000ae8)

	  Location is global 'Global' of size 4 at 0x7f055b4802b0 (a+0x0000002012b0)

	  Thread T1 (tid=14547, running) created by main thread at:
		#0 pthread_create /opt/gcc-4.9.2/src/gcc-4.9.2/libsanitizer/tsan/tsan_interceptors.cc:877 (libtsan.so.0+0x00000004aa83)
		#1 main /home/nan/a.c:9 (a+0x000000000ad9)

	SUMMARY: ThreadSanitizer: data race /home/nan/a.c:4 Thread1
	==================
	ThreadSanitizer: reported 1 warnings

可以看到,执行程序时检测出了对`Global`变量的竞争访问。  
详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Debugging-Options.html#index-fsanitize_003dthread-595)
## 贡献者
nanxiao

================================================
FILE: src/turn-on-warnings.md
================================================
# 打开警告信息

## 技巧

你的程序编译通过了,但并不意味着已经万事大吉,也许还存在一些不规范的地方,或者一些错误隐患。建议,使用`-Wall`选项打开所有的警告信息,把所有的警告都处理掉。

	$ gcc -Wall ...

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options)

## 贡献者

xmj



================================================
FILE: src/undefine-macro.md
================================================
# 在命令行中取消宏定义

## 技巧

类似于`-D`选项,你可以使用`-U`选项在命令行中取消一个宏的定义,比如:

	$ gcc -U DEBUG macro.c

中间可以没有空格:

	$ gcc -UDEBUG macro.c

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options)

## 贡献者

xmj



================================================
FILE: src/verbose-asm.md
================================================
# 生成有详细信息的汇编文件

## 例子

	#include <stdio.h>
	
	int main(void)
	{
	  int i;
	
	  for (i = 0; i < 10; i++)
	    printf("%d ", i);
	  putchar ('\n');
	
	  return 0;
	}

## 技巧

使用`-fverbose-asm`选项就可以生成带有详细信息的汇编文件:

	$ gcc -S -fverbose-asm foo.c
	$ cat foo.s
		.file	"foo.c"
	# GNU C (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (x86_64-linux-gnu)
	#	compiled by GNU C version 4.6.3, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9
	# GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
	# options passed:  -imultilib . -imultiarch x86_64-linux-gnu foo.c
	# -mtune=generic -march=x86-64 -fverbose-asm -fstack-protector
	# options enabled:  -fasynchronous-unwind-tables -fauto-inc-dec
	# -fbranch-count-reg -fcommon -fdelete-null-pointer-checks -fdwarf2-cfi-asm
	# -fearly-inlining -feliminate-unused-debug-types -ffunction-cse -fgcse-lm
	# -fident -finline-functions-called-once -fira-share-save-slots
	# -fira-share-spill-slots -fivopts -fkeep-static-consts
	# -fleading-underscore -fmath-errno -fmerge-debug-strings
	# -fmove-loop-invariants -fpeephole -fprefetch-loop-arrays
	# -freg-struct-return -fsched-critical-path-heuristic
	# -fsched-dep-count-heuristic -fsched-group-heuristic -fsched-interblock
	# -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec
	# -fsched-spec-insn-heuristic -fsched-stalled-insns-dep -fshow-column
	# -fsigned-zeros -fsplit-ivs-in-unroller -fstack-protector
	# -fstrict-volatile-bitfields -ftrapping-math -ftree-cselim -ftree-forwprop
	# -ftree-loop-if-convert -ftree-loop-im -ftree-loop-ivcanon
	# -ftree-loop-optimize -ftree-parallelize-loops= -ftree-phiprop -ftree-pta
	# -ftree-reassoc -ftree-scev-cprop -ftree-slp-vectorize
	# -ftree-vect-loop-version -funit-at-a-time -funwind-tables
	# -fvect-cost-model -fverbose-asm -fzero-initialized-in-bss
	# -m128bit-long-double -m64 -m80387 -maccumulate-outgoing-args
	# -malign-stringops -mfancy-math-387 -mfp-ret-in-387 -mglibc -mieee-fp
	# -mmmx -mno-sse4 -mpush-args -mred-zone -msse -msse2 -mtls-direct-seg-refs
	
	# Compiler executable checksum: 75e879ed14f91af504f4150eadeaa0e6
	
		.section	.rodata
	.LC0:
		.string	"%d "
		.text
		.globl	main
		.type	main, @function
	main:
	.LFB0:
		.cfi_startproc
		pushq	%rbp	#
		.cfi_def_cfa_offset 16
		.cfi_offset 6, -16
		movq	%rsp, %rbp	#,
		.cfi_def_cfa_register 6
		subq	$16, %rsp	#,
		movl	$0, -4(%rbp)	#, i
		jmp	.L2	#
	.L3:
		movl	$.LC0, %eax	#, D.2049
		movl	-4(%rbp), %edx	# i, tmp62
		movl	%edx, %esi	# tmp62,
		movq	%rax, %rdi	# D.2049,
		movl	$0, %eax	#,
		call	printf	#
		addl	$1, -4(%rbp)	#, i
	.L2:
		cmpl	$9, -4(%rbp)	#, i
		jle	.L3	#,
		movl	$10, %edi	#,
		call	putchar	#
		movl	$0, %eax	#, D.2050
		leave
		.cfi_def_cfa 7, 8
		ret
		.cfi_endproc
	.LFE0:
		.size	main, .-main
		.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
		.section	.note.GNU-stack,"",@progbits

可以看到,在汇编文件中给出了gcc所使用的具体选项,以及汇编指令操作数所对应的源程序(或中间代码)中的变量。

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fverbose-asm-2614)

## 贡献者

xmj



================================================
FILE: src/warnings-treated-as-errors.md
================================================
# all warnings being treated as errors

## 技巧

在ubuntu系统下编译一个程序包,有时会遇到这样的错误:

	$ make
	...
	cc1: all warnings being treated as errors

这是因为缺省的CFLAGS里含有`-Werror`选项,将警告信息升级为错误。当然,一方面这可以让你重视这些可能会带来隐患的警告信息;但,如果你不想修改源码,也可以把这个选项关掉,通过修改Makefile或者使用命令行:

	$ make CFLAGS="... -Wno-error"

详情参见[gcc手册](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#Preprocessor-Options)

## 贡献者

xmj



================================================
FILE: utils/build.go
================================================
// 代码源自https://github.com/astaxie/build-web-application-with-golang.git

package main

import (
	"fmt"
	"github.com/fairlyblank/md2min"
	"io/ioutil"
	"os"
	"path/filepath"
	"regexp"
	"strings"
)

// 定义一个访问者结构体
type Visitor struct{}

func (self *Visitor) md2html(arg map[string]string) error {
	from := arg["from"]
	to := arg["to"]
	err := filepath.Walk(from+"/", func(path string, f os.FileInfo, err error) error {
		if f == nil {
			return err
		}
		if f.IsDir() {
			return nil
		}
		if (f.Mode() & os.ModeSymlink) > 0 {
			return nil
		}
		if !strings.HasSuffix(f.Name(), ".md") {
			return nil
		}

		file, err := os.Open(path)
		if err != nil {
			return err
		}

		input_byte, _ := ioutil.ReadAll(file)
		input := string(input_byte)
		input = regexp.MustCompile(`\[(.*?)\]\(<?(.*?)\.md>?\)`).ReplaceAllString(input, "[$1](<$2.html>)")

		if f.Name() == "README.md" {
			input = regexp.MustCompile(`https:\/\/github\.com\/astaxie\/build-web-application-with-golang\/blob\/master\/`).ReplaceAllString(input, "")
		}

		// 以#开头的行,在#后增加空格
		// 以#开头的行, 删除多余的空格
		input = FixHeader(input)

		// 删除页面链接
		input = RemoveFooterLink(input)

		var out *os.File
		filename := strings.Replace(f.Name(), ".md", ".html", -1)
		fmt.Println(to + "/" + filename)
		if out, err = os.Create(to + "/" + filename); err != nil {
			fmt.Fprintf(os.Stderr, "Error creating %s: %v", f.Name(), err)
			os.Exit(-1)
		}
		defer out.Close()
		md := md2min.New("none")
		err = md.Parse([]byte(input), out)
		if err != nil {
			fmt.Fprintln(os.Stderr, "Parsing Error", err)
			os.Exit(-1)
		}

		return nil
	})
	return err
}

func FixHeader(input string) string {
	re_header := regexp.MustCompile(`(?m)^#.+$`)
	re_sub := regexp.MustCompile(`^(#+)\s*(.+)$`)
	fixer := func(header string) string {
		s := re_sub.FindStringSubmatch(header)
		return s[1] + " " + s[2]
	}
	return re_header.ReplaceAllStringFunc(input, fixer)
}

func RemoveFooterLink(input string) string {
	re_footer := regexp.MustCompile(`(?m)^#{2,} links.*?\n(.+\n)*`)
	return re_footer.ReplaceAllString(input, "")
}

func main() {
	html := os.Getenv("HTML")
	if html == "" {
		html = "."
	}

	src := os.Getenv("WORKDIR")
	if src == "" {
		src = "."
	}

	arg := map[string]string{
		"from": src,
		"to":   html,
	}

	v := &Visitor{}
	err := v.md2html(arg)
	if err != nil {
		fmt.Printf("filepath.Walk() returned %v\n", err)
	}
}
Download .txt
gitextract_fb7pq984/

├── LICENSE
├── README.md
├── build.sh
├── src/
│   ├── address-sanitizer.md
│   ├── cast-lose-precision.md
│   ├── define-macro.md
│   ├── diagnostics-color.md
│   ├── index.md
│   ├── inhibit-linemarkers.md
│   ├── must-emit-function-code.md
│   ├── must-forceinline-function-code.md
│   ├── pack-struct.md
│   ├── pass-options-to-assembler.md
│   ├── pass-options-to-linker.md
│   ├── print-commands-only.md
│   ├── print-file-name.md
│   ├── print-header-search-dir.md
│   ├── print-level-options.md
│   ├── print-predefined-macros.md
│   ├── save-temps.md
│   ├── set-dynamic-linker.md
│   ├── specify-language.md
│   ├── syntax-only.md
│   ├── thread-sanitizer.md
│   ├── turn-on-warnings.md
│   ├── undefine-macro.md
│   ├── verbose-asm.md
│   └── warnings-treated-as-errors.md
└── utils/
    └── build.go
Download .txt
SYMBOL INDEX (5 symbols across 1 files)

FILE: utils/build.go
  type Visitor (line 16) | type Visitor struct
    method md2html (line 18) | func (self *Visitor) md2html(arg map[string]string) error {
  function FixHeader (line 75) | func FixHeader(input string) string {
  function RemoveFooterLink (line 85) | func RemoveFooterLink(input string) string {
  function main (line 90) | func main() {
Condensed preview — 29 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (82K chars).
[
  {
    "path": "LICENSE",
    "chars": 22962,
    "preview": "\n                GNU Free Documentation License\n                 Version 1.3, 3 November 2008\n\n\n Copyright (C) 2000, 200"
  },
  {
    "path": "README.md",
    "chars": 879,
    "preview": "# 《100个gcc小技巧》\n\n一个关于gcc使用小技巧的文档。100,在这里可能只是表明很多;具体的数目取决于您的参与和贡献。\n\n## 在线阅读\n[开始阅读](<https://github.com/hellogcc/100-gcc-ti"
  },
  {
    "path": "build.sh",
    "chars": 634,
    "preview": "#!/bin/sh\n\n# This script invokes md2min to convert markdown files to minimal html files,\n# using github css. So go and m"
  },
  {
    "path": "src/address-sanitizer.md",
    "chars": 5577,
    "preview": "# 利用Address Sanitizer工具检查内存访问错误\n\n## 例子  \n\ta.c:\n\t#include <stdio.h>\n\n\tint main(void) {\n\t        // your code goes here\n\t "
  },
  {
    "path": "src/cast-lose-precision.md",
    "chars": 852,
    "preview": "# error: cast from ... to ... loses precision\n\n## 例子\n\n\t#include <iostream>\n\t\n\tclass Foo {\n\t public:\n\t  void print() cons"
  },
  {
    "path": "src/define-macro.md",
    "chars": 483,
    "preview": "# 在命令行中预定义宏\n\n## 例子\n\n\t#include <stdio.h>\n\t\n\tint main (void)\n\t{\n\t  int i, sum;\n\t\n\t  for (i = 1, sum = 0; i <= 10; i++)\n\t  "
  },
  {
    "path": "src/diagnostics-color.md",
    "chars": 227,
    "preview": "# 打印彩色诊断信息\n\n## 技巧\n\n这是gcc-4.9新增的功能,可以通过定义环境变量`GCC_COLORS`来彩色打印诊断信息。\n\n也可以使用选项`-fdiagnostics-color`来设定。\n\n详情参见[gcc手册](https:"
  },
  {
    "path": "src/index.md",
    "chars": 1093,
    "preview": "# 信息显示\n* [打印gcc预定义的宏信息](print-predefined-macros.md)\n* [打印gcc执行的子命令](print-commands-only.md)\n* [打印优化级别的对应选项](print-level-"
  },
  {
    "path": "src/inhibit-linemarkers.md",
    "chars": 766,
    "preview": "# 生成没有行号标记的预处理文件\n\n## 技巧\n\n有时编译程序会遇到如下类似的错误,\n\n\tIn file included from foo.c:15,\n\tfrom a.h:45,\n\tb.h:53: error: ... ...\n\n如果错误"
  },
  {
    "path": "src/must-emit-function-code.md",
    "chars": 489,
    "preview": "# 禁止函数被优化掉\n\n## 例子\n\n\t#if (GCC_VERSION > 4000)\n\t#define DEBUG_FUNCTION __attribute__ ((__used__))\n\t#define DEBUG_VARIABLE "
  },
  {
    "path": "src/must-forceinline-function-code.md",
    "chars": 373,
    "preview": "# 强制函数永远以inline的形式调用\n\n## 例子\n\n\t#if defined(__GNUC__)\n\t#define FORCEDINLINE  __attribute__((always_inline))\n\t#else \n\t#def"
  },
  {
    "path": "src/pack-struct.md",
    "chars": 1817,
    "preview": "# 改变结构体成员的字节对齐\n\n## 例子  \n\t#include <stdio.h>\n\n\ttypedef struct\n\t{\n\t\t\tchar a;\n\t\t\tint b;\n\t} ST_A;\n\n\tint main(void)\n\t{\n\t\t\tpri"
  },
  {
    "path": "src/pass-options-to-assembler.md",
    "chars": 1678,
    "preview": "# 把选项传给汇编器\n\n## 例子\n\n\t#include <stdio.h>\n\t\n\tint main(void)\n\t{\n\t  int i;\n\t\n\t  for (i = 0; i < 10; i++)\n\t    printf(\"%d \", i"
  },
  {
    "path": "src/pass-options-to-linker.md",
    "chars": 9328,
    "preview": "# 把选项传给连接器\n\n## 例子\n\n\t#include <stdio.h>\n\t\n\tint main (void)\n\t{\n\t  puts (\"Hello world!\");\n\t  return 0;\n\t}\n\n## 技巧\n\n使用`-Wl,op"
  },
  {
    "path": "src/print-commands-only.md",
    "chars": 4366,
    "preview": "# 打印gcc执行的子命令\n\n## 例子\n\n\t$ gcc -### foo.c\n\tUsing built-in specs.\n\tCOLLECT_GCC=gcc\n\tCOLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64"
  },
  {
    "path": "src/print-file-name.md",
    "chars": 287,
    "preview": "# 打印连接库的具体路径\n\n## 例子\n\n\t$ gcc -print-file-name=libc.a\n\t/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.a\n"
  },
  {
    "path": "src/print-header-search-dir.md",
    "chars": 548,
    "preview": "# 打印头文件搜索路径\n\n## 例子\n\n\t$ gcc -v foo.c\n\t...\n\tignoring nonexistent directory \"/usr/local/include/x86_64-linux-gnu\"\n\tignoring"
  },
  {
    "path": "src/print-level-options.md",
    "chars": 8434,
    "preview": "# 打印优化级别的对应选项\n\n## 例子\n\n\t$ gcc -Q --help=optimizers\n\tThe following options control optimizations:\n\t  -O<number>           "
  },
  {
    "path": "src/print-predefined-macros.md",
    "chars": 853,
    "preview": "# 打印gcc预定义的宏信息\n\n## 例子\n\n\t[root@linux:~]$ gcc -dM -E - < /dev/null\n\t#define __DBL_MIN_EXP__ (-1021)\n\t#define __FLT_MIN__ 1"
  },
  {
    "path": "src/save-temps.md",
    "chars": 438,
    "preview": "# 保存临时文件\n\n## 例子\n\n\t$ gcc -save-temps a/foo.c\n\t$ ls foo.*\n\tfoo.c  foo.i  foo.o  foo.s\n\n\t$ gcc -save-temps=obj a/foo.c -o a"
  },
  {
    "path": "src/set-dynamic-linker.md",
    "chars": 849,
    "preview": "# 设置动态连接器\n\n## 技巧\n\n有人问我,如何通过选项来指定动态连接器,而不使用缺省系统自带的动态连接器。我后来查了下ld的手册,有这么一个选项:\n\n\t-Ifile\n\t--dynamic-linker=file     \n\t    Se"
  },
  {
    "path": "src/specify-language.md",
    "chars": 348,
    "preview": "# 指定语言类型\n\n## 技巧\n\ngcc是通过文件名后缀来判断源代码语言类型的。\n\n如果你从标准输入把源码传给gcc,那么就需要通过`-x`选项显式的指定语言类型:\n\n\t$ echo \"int x;\" | gcc -S -x c -\n\t$ "
  },
  {
    "path": "src/syntax-only.md",
    "chars": 314,
    "preview": "# 只做语法检查\n\n## 例子\n\n\t$ cat foo.c\n\tunion u {\n\t  char c;\n\t  int i;\n\t}\n\t$ gcc -fsyntax-only foo.c\n\tfoo.c:4:1: error: expected "
  },
  {
    "path": "src/thread-sanitizer.md",
    "chars": 1349,
    "preview": "# 利用Thread Sanitizer工具检查数据竞争的问题\n\n## 例子  \n\t#include <pthread.h>\n\tint Global;\n\tvoid *Thread1(void *x) {\n\t  Global = 42;\n\t "
  },
  {
    "path": "src/turn-on-warnings.md",
    "chars": 227,
    "preview": "# 打开警告信息\n\n## 技巧\n\n你的程序编译通过了,但并不意味着已经万事大吉,也许还存在一些不规范的地方,或者一些错误隐患。建议,使用`-Wall`选项打开所有的警告信息,把所有的警告都处理掉。\n\n\t$ gcc -Wall ...\n\n详情"
  },
  {
    "path": "src/undefine-macro.md",
    "chars": 230,
    "preview": "# 在命令行中取消宏定义\n\n## 技巧\n\n类似于`-D`选项,你可以使用`-U`选项在命令行中取消一个宏的定义,比如:\n\n\t$ gcc -U DEBUG macro.c\n\n中间可以没有空格:\n\n\t$ gcc -UDEBUG macro.c\n"
  },
  {
    "path": "src/verbose-asm.md",
    "chars": 3019,
    "preview": "# 生成有详细信息的汇编文件\n\n## 例子\n\n\t#include <stdio.h>\n\t\n\tint main(void)\n\t{\n\t  int i;\n\t\n\t  for (i = 0; i < 10; i++)\n\t    printf(\"%d "
  },
  {
    "path": "src/warnings-treated-as-errors.md",
    "chars": 389,
    "preview": "# all warnings being treated as errors\n\n## 技巧\n\n在ubuntu系统下编译一个程序包,有时会遇到这样的错误:\n\n\t$ make\n\t...\n\tcc1: all warnings being trea"
  },
  {
    "path": "utils/build.go",
    "chars": 2367,
    "preview": "// 代码源自https://github.com/astaxie/build-web-application-with-golang.git\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/fair"
  }
]

About this extraction

This page contains the full source code of the hellogcc/100-gcc-tips GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 29 files (69.5 KB), approximately 24.2k tokens, and a symbol index with 5 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!