github.com/MangoDowner/go-gm@v0.0.0-20180818020936-8baa2bd4408c/doc/gccgo_install.html (about) 1 <!--{ 2 "Title": "Setting up and using gccgo", 3 "Path": "/doc/install/gccgo" 4 }--> 5 6 <p> 7 This document explains how to use gccgo, a compiler for 8 the Go language. The gccgo compiler is a new frontend 9 for GCC, the widely used GNU compiler. Although the 10 frontend itself is under a BSD-style license, gccgo is 11 normally used as part of GCC and is then covered by 12 the <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public 13 License</a> (the license covers gccgo itself as part of GCC; it 14 does not cover code generated by gccgo). 15 </p> 16 17 <p> 18 Note that gccgo is not the <code>gc</code> compiler; see 19 the <a href="/doc/install.html">Installing Go</a> instructions for that 20 compiler. 21 </p> 22 23 <h2 id="Releases">Releases</h2> 24 25 <p> 26 The simplest way to install gccgo is to install a GCC binary release 27 built to include Go support. GCC binary releases are available from 28 <a href="http://gcc.gnu.org/install/binaries.html">various 29 websites</a> and are typically included as part of GNU/Linux 30 distributions. We expect that most people who build these binaries 31 will include Go support. 32 </p> 33 34 <p> 35 The GCC 4.7.1 release and all later 4.7 releases include a complete 36 <a href="/doc/go1.html">Go 1</a> compiler and libraries. 37 </p> 38 39 <p> 40 Due to timing, the GCC 4.8.0 and 4.8.1 releases are close to but not 41 identical to Go 1.1. The GCC 4.8.2 release includes a complete Go 42 1.1.2 implementation. 43 </p> 44 45 <p> 46 The GCC 4.9 releases include a complete Go 1.2 implementation. 47 </p> 48 49 <p> 50 The GCC 5 releases include a complete implementation of the Go 1.4 51 user libraries. The Go 1.4 runtime is not fully merged, but that 52 should not be visible to Go programs. 53 </p> 54 55 <p> 56 The GCC 6 releases include a complete implementation of the Go 1.6.1 57 user libraries. The Go 1.6 runtime is not fully merged, but that 58 should not be visible to Go programs. 59 </p> 60 61 <p> 62 The GCC 7 releases are expected to include a complete implementation 63 of the Go 1.8 user libraries. As with earlier releases, the Go 1.8 64 runtime is not fully merged, but that should not be visible to Go 65 programs. 66 </p> 67 68 <h2 id="Source_code">Source code</h2> 69 70 <p> 71 If you cannot use a release, or prefer to build gccgo for 72 yourself, 73 the gccgo source code is accessible via Subversion. The 74 GCC web site 75 has <a href="http://gcc.gnu.org/svn.html">instructions for getting the 76 GCC source code</a>. The gccgo source code is included. As a 77 convenience, a stable version of the Go support is available in 78 a branch of the main GCC code 79 repository: <code>svn://gcc.gnu.org/svn/gcc/branches/gccgo</code>. 80 This branch is periodically updated with stable Go compiler sources. 81 </p> 82 83 <p> 84 Note that although <code>gcc.gnu.org</code> is the most convenient way 85 to get the source code for the Go frontend, it is not where the master 86 sources live. If you want to contribute changes to the Go frontend 87 compiler, see <a href="/doc/gccgo_contribute.html">Contributing to 88 gccgo</a>. 89 </p> 90 91 92 <h2 id="Building">Building</h2> 93 94 <p> 95 Building gccgo is just like building GCC 96 with one or two additional options. See 97 the <a href="http://gcc.gnu.org/install/">instructions on the gcc web 98 site</a>. When you run <code>configure</code>, add the 99 option <code>--enable-languages=c,c++,go</code> (along with other 100 languages you may want to build). If you are targeting a 32-bit x86, 101 then you will want to build gccgo to default to 102 supporting locked compare and exchange instructions; do this by also 103 using the <code>configure</code> option <code>--with-arch=i586</code> 104 (or a newer architecture, depending on where you need your programs to 105 run). If you are targeting a 64-bit x86, but sometimes want to use 106 the <code>-m32</code> option, then use the <code>configure</code> 107 option <code>--with-arch-32=i586</code>. 108 </p> 109 110 <h3 id="Gold">Gold</h3> 111 112 <p> 113 On x86 GNU/Linux systems the gccgo compiler is able to 114 use a small discontiguous stack for goroutines. This permits programs 115 to run many more goroutines, since each goroutine can use a relatively 116 small stack. Doing this requires using the gold linker version 2.22 117 or later. You can either install GNU binutils 2.22 or later, or you 118 can build gold yourself. 119 </p> 120 121 <p> 122 To build gold yourself, build the GNU binutils, 123 using <code>--enable-gold=default</code> when you run 124 the <code>configure</code> script. Before building, you must install 125 the flex and bison packages. A typical sequence would look like 126 this (you can replace <code>/opt/gold</code> with any directory to 127 which you have write access): 128 </p> 129 130 <pre> 131 cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src login 132 [password is "anoncvs"] 133 [The next command will create a directory named src, not binutils] 134 cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src co binutils 135 mkdir binutils-objdir 136 cd binutils-objdir 137 ../src/configure --enable-gold=default --prefix=/opt/gold 138 make 139 make install 140 </pre> 141 142 <p> 143 However you install gold, when you configure gccgo, use the 144 option <code>--with-ld=<var>GOLD_BINARY</var></code>. 145 </p> 146 147 <h3 id="Prerequisites">Prerequisites</h3> 148 149 <p> 150 A number of prerequisites are required to build GCC, as 151 described on 152 the <a href="http://gcc.gnu.org/install/prerequisites.html">gcc web 153 site</a>. It is important to install all the prerequisites before 154 running the gcc <code>configure</code> script. 155 The prerequisite libraries can be conveniently downloaded using the 156 script <code>contrib/download_prerequisites</code> in the GCC sources. 157 158 <h3 id="Build_commands">Build commands</h3> 159 160 <p> 161 Once all the prerequisites are installed, then a typical build and 162 install sequence would look like this (only use 163 the <code>--with-ld</code> option if you are using the gold linker as 164 described above): 165 </p> 166 167 <pre> 168 svn checkout svn://gcc.gnu.org/svn/gcc/branches/gccgo gccgo 169 mkdir objdir 170 cd objdir 171 ../gccgo/configure --prefix=/opt/gccgo --enable-languages=c,c++,go --with-ld=/opt/gold/bin/ld 172 make 173 make install 174 </pre> 175 176 <h2 id="Using_gccgo">Using gccgo</h2> 177 178 <p> 179 The gccgo compiler works like other gcc frontends. As of GCC 5 the gccgo 180 installation also includes a version of the <code>go</code> command, 181 which may be used to build Go programs as described at 182 <a href="https://golang.org/cmd/go">https://golang.org/cmd/go</a>. 183 </p> 184 185 <p> 186 To compile a file without using the <code>go</code> command: 187 </p> 188 189 <pre> 190 gccgo -c file.go 191 </pre> 192 193 <p> 194 That produces <code>file.o</code>. To link files together to form an 195 executable: 196 </p> 197 198 <pre> 199 gccgo -o file file.o 200 </pre> 201 202 <p> 203 To run the resulting file, you will need to tell the program where to 204 find the compiled Go packages. There are a few ways to do this: 205 </p> 206 207 <ul> 208 <li> 209 <p> 210 Set the <code>LD_LIBRARY_PATH</code> environment variable: 211 </p> 212 213 <pre> 214 LD_LIBRARY_PATH=${prefix}/lib/gcc/MACHINE/VERSION 215 [or] 216 LD_LIBRARY_PATH=${prefix}/lib64/gcc/MACHINE/VERSION 217 export LD_LIBRARY_PATH 218 </pre> 219 220 <p> 221 Here <code>${prefix}</code> is the <code>--prefix</code> option used 222 when building gccgo. For a binary install this is 223 normally <code>/usr</code>. Whether to use <code>lib</code> 224 or <code>lib64</code> depends on the target. 225 Typically <code>lib64</code> is correct for x86_64 systems, 226 and <code>lib</code> is correct for other systems. The idea is to 227 name the directory where <code>libgo.so</code> is found. 228 </p> 229 230 </li> 231 232 <li> 233 <p> 234 Passing a <code>-Wl,-R</code> option when you link (replace lib with 235 lib64 if appropriate for your system): 236 </p> 237 238 <pre> 239 go build -gccgoflags -Wl,-R,${prefix}/lib/gcc/MACHINE/VERSION 240 [or] 241 gccgo -o file file.o -Wl,-R,${prefix}/lib/gcc/MACHINE/VERSION 242 </pre> 243 </li> 244 245 <li> 246 <p> 247 Use the <code>-static-libgo</code> option to link statically against 248 the compiled packages. 249 </p> 250 </li> 251 252 <li> 253 <p> 254 Use the <code>-static</code> option to do a fully static link (the 255 default for the <code>gc</code> compiler). 256 </p> 257 </li> 258 </ul> 259 260 <h2 id="Options">Options</h2> 261 262 <p> 263 The gccgo compiler supports all GCC options 264 that are language independent, notably the <code>-O</code> 265 and <code>-g</code> options. 266 </p> 267 268 <p> 269 The <code>-fgo-pkgpath=PKGPATH</code> option may be used to set a 270 unique prefix for the package being compiled. 271 This option is automatically used by the go command, but you may want 272 to use it if you invoke gccgo directly. 273 This option is intended for use with large 274 programs that contain many packages, in order to allow multiple 275 packages to use the same identifier as the package name. 276 The <code>PKGPATH</code> may be any string; a good choice for the 277 string is the path used to import the package. 278 </p> 279 280 <p> 281 The <code>-I</code> and <code>-L</code> options, which are synonyms 282 for the compiler, may be used to set the search path for finding 283 imports. 284 These options are not needed if you build with the go command. 285 </p> 286 287 <h2 id="Imports">Imports</h2> 288 289 <p> 290 When you compile a file that exports something, the export 291 information will be stored directly in the object file. 292 If you build with gccgo directly, rather than with the go command, 293 then when you import a package, you must tell gccgo how to find the 294 file. 295 </p> 296 297 <p> 298 When you import the package <var>FILE</var> with gccgo, 299 it will look for the import data in the following files, and use the 300 first one that it finds. 301 302 <ul> 303 <li><code><var>FILE</var>.gox</code> 304 <li><code>lib<var>FILE</var>.so</code> 305 <li><code>lib<var>FILE</var>.a</code> 306 <li><code><var>FILE</var>.o</code> 307 </ul> 308 309 <p> 310 <code><var>FILE</var>.gox</code>, when used, will typically contain 311 nothing but export data. This can be generated from 312 <code><var>FILE</var>.o</code> via 313 </p> 314 315 <pre> 316 objcopy -j .go_export FILE.o FILE.gox 317 </pre> 318 319 <p> 320 The gccgo compiler will look in the current 321 directory for import files. In more complex scenarios you 322 may pass the <code>-I</code> or <code>-L</code> option to 323 gccgo. Both options take directories to search. The 324 <code>-L</code> option is also passed to the linker. 325 </p> 326 327 <p> 328 The gccgo compiler does not currently (2015-06-15) record 329 the file name of imported packages in the object file. You must 330 arrange for the imported data to be linked into the program. 331 Again, this is not necessary when building with the go command. 332 </p> 333 334 <pre> 335 gccgo -c mypackage.go # Exports mypackage 336 gccgo -c main.go # Imports mypackage 337 gccgo -o main main.o mypackage.o # Explicitly links with mypackage.o 338 </pre> 339 340 <h2 id="Debugging">Debugging</h2> 341 342 <p> 343 If you use the <code>-g</code> option when you compile, you can run 344 <code>gdb</code> on your executable. The debugger has only limited 345 knowledge about Go. You can set breakpoints, single-step, 346 etc. You can print variables, but they will be printed as though they 347 had C/C++ types. For numeric types this doesn't matter. Go strings 348 and interfaces will show up as two-element structures. Go 349 maps and channels are always represented as C pointers to run-time 350 structures. 351 </p> 352 353 <h2 id="C_Interoperability">C Interoperability</h2> 354 355 <p> 356 When using gccgo there is limited interoperability with C, 357 or with C++ code compiled using <code>extern "C"</code>. 358 </p> 359 360 <h3 id="Types">Types</h3> 361 362 <p> 363 Basic types map directly: an <code>int32</code> in Go is 364 an <code>int32_t</code> in C, an <code>int64</code> is 365 an <code>int64_t</code>, etc. 366 The Go type <code>int</code> is an integer that is the same size as a 367 pointer, and as such corresponds to the C type <code>intptr_t</code>. 368 Go <code>byte</code> is equivalent to C <code>unsigned char</code>. 369 Pointers in Go are pointers in C. 370 A Go <code>struct</code> is the same as C <code>struct</code> with the 371 same fields and types. 372 </p> 373 374 <p> 375 The Go <code>string</code> type is currently defined as a two-element 376 structure (this is <b style="color: red;">subject to change</b>): 377 </p> 378 379 <pre> 380 struct __go_string { 381 const unsigned char *__data; 382 intptr_t __length; 383 }; 384 </pre> 385 386 <p> 387 You can't pass arrays between C and Go. However, a pointer to an 388 array in Go is equivalent to a C pointer to the 389 equivalent of the element type. 390 For example, Go <code>*[10]int</code> is equivalent to C <code>int*</code>, 391 assuming that the C pointer does point to 10 elements. 392 </p> 393 394 <p> 395 A slice in Go is a structure. The current definition is 396 (this is <b style="color: red;">subject to change</b>): 397 </p> 398 399 <pre> 400 struct __go_slice { 401 void *__values; 402 intptr_t __count; 403 intptr_t __capacity; 404 }; 405 </pre> 406 407 <p> 408 The type of a Go function is a pointer to a struct (this is 409 <b style="color: red;">subject to change</b>). The first field in the 410 struct points to the code of the function, which will be equivalent to 411 a pointer to a C function whose parameter types are equivalent, with 412 an additional trailing parameter. The trailing parameter is the 413 closure, and the argument to pass is a pointer to the Go function 414 struct. 415 416 When a Go function returns more than one value, the C function returns 417 a struct. For example, these functions are roughly equivalent: 418 </p> 419 420 <pre> 421 func GoFunction(int) (int, float64) 422 struct { int i; float64 f; } CFunction(int, void*) 423 </pre> 424 425 <p> 426 Go <code>interface</code>, <code>channel</code>, and <code>map</code> 427 types have no corresponding C type (<code>interface</code> is a 428 two-element struct and <code>channel</code> and <code>map</code> are 429 pointers to structs in C, but the structs are deliberately undocumented). C 430 <code>enum</code> types correspond to some integer type, but precisely 431 which one is difficult to predict in general; use a cast. C <code>union</code> 432 types have no corresponding Go type. C <code>struct</code> types containing 433 bitfields have no corresponding Go type. C++ <code>class</code> types have 434 no corresponding Go type. 435 </p> 436 437 <p> 438 Memory allocation is completely different between C and Go, as Go uses 439 garbage collection. The exact guidelines in this area are undetermined, 440 but it is likely that it will be permitted to pass a pointer to allocated 441 memory from C to Go. The responsibility of eventually freeing the pointer 442 will remain with C side, and of course if the C side frees the pointer 443 while the Go side still has a copy the program will fail. When passing a 444 pointer from Go to C, the Go function must retain a visible copy of it in 445 some Go variable. Otherwise the Go garbage collector may delete the 446 pointer while the C function is still using it. 447 </p> 448 449 <h3 id="Function_names">Function names</h3> 450 451 <p> 452 Go code can call C functions directly using a Go extension implemented 453 in gccgo: a function declaration may be preceded by 454 <code>//extern NAME</code>. For example, here is how the C function 455 <code>open</code> can be declared in Go: 456 </p> 457 458 <pre> 459 //extern open 460 func c_open(name *byte, mode int, perm int) int 461 </pre> 462 463 <p> 464 The C function naturally expects a NUL-terminated string, which in 465 Go is equivalent to a pointer to an array (not a slice!) of 466 <code>byte</code> with a terminating zero byte. So a sample call 467 from Go would look like (after importing the <code>syscall</code> package): 468 </p> 469 470 <pre> 471 var name = [4]byte{'f', 'o', 'o', 0}; 472 i := c_open(&name[0], syscall.O_RDONLY, 0); 473 </pre> 474 475 <p> 476 (this serves as an example only, to open a file in Go please use Go's 477 <code>os.Open</code> function instead). 478 </p> 479 480 <p> 481 Note that if the C function can block, such as in a call 482 to <code>read</code>, calling the C function may block the Go program. 483 Unless you have a clear understanding of what you are doing, all calls 484 between C and Go should be implemented through cgo or SWIG, as for 485 the <code>gc</code> compiler. 486 </p> 487 488 <p> 489 The name of Go functions accessed from C is subject to change. At present 490 the name of a Go function that does not have a receiver is 491 <code>prefix.package.Functionname</code>. The prefix is set by 492 the <code>-fgo-prefix</code> option used when the package is compiled; 493 if the option is not used, the default is <code>go</code>. 494 To call the function from C you must set the name using 495 a GCC extension. 496 </p> 497 498 <pre> 499 extern int go_function(int) __asm__ ("myprefix.mypackage.Function"); 500 </pre> 501 502 <h3 id="Automatic_generation_of_Go_declarations_from_C_source_code"> 503 Automatic generation of Go declarations from C source code</h3> 504 505 <p> 506 The Go version of GCC supports automatically generating 507 Go declarations from C code. The facility is rather awkward, and most 508 users should use the <a href="/cmd/cgo">cgo</a> program with 509 the <code>-gccgo</code> option instead. 510 </p> 511 512 <p> 513 Compile your C code as usual, and add the option 514 <code>-fdump-go-spec=<var>FILENAME</var></code>. This will create the 515 file <code><var>FILENAME</var></code> as a side effect of the 516 compilation. This file will contain Go declarations for the types, 517 variables and functions declared in the C code. C types that can not 518 be represented in Go will be recorded as comments in the Go code. The 519 generated file will not have a <code>package</code> declaration, but 520 can otherwise be compiled directly by gccgo. 521 </p> 522 523 <p> 524 This procedure is full of unstated caveats and restrictions and we make no 525 guarantee that it will not change in the future. It is more useful as a 526 starting point for real Go code than as a regular procedure. 527 </p>