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