aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/amd64/obj.go
AgeCommit message (Collapse)Author
2025-10-07Revert "cmd/compile: redo arm64 LR/FP save and restore"Keith Randall
This reverts commit 719dfcf8a8478d70360bf3c34c0e920be7b32994. Reason for revert: Causing crashes. Change-Id: I0b8526dd03d82fa074ce4f97f1789eeac702b3eb Reviewed-on: https://go-review.googlesource.com/c/go/+/709755 Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: David Chase <drchase@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Keith Randall <khr@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com>
2025-10-06cmd/compile: redo arm64 LR/FP save and restoreKeith Randall
Instead of storing LR (the return address) at 0(SP) and the FP (parent's frame pointer) at -8(SP), store them at framesize-8(SP) and framesize-16(SP), respectively. We push and pop data onto the stack such that we're never accessing anything below SP. The prolog/epilog lengths are unchanged (3 insns for a typical prolog, 2 for a typical epilog). We use 8 bytes more per frame. Typical prologue: STP.W (FP, LR), -16(SP) MOVD SP, FP SUB $C, SP Typical epilogue: ADD $C, SP LDP.P 16(SP), (FP, LR) RET The previous word where we stored LR, at 0(SP), is now unused. We could repurpose that slot for storing a local variable. The new prolog and epilog instructions are recognized by libunwind, so pc-sampling tools like perf should now be accurate. (TODO: except maybe after the first RET instruction? Have to look into that.) Update #73753 (fixes, for arm64) Update #57302 (Quim thinks this will help on that issue) Change-Id: I4800036a9a9a08aaaf35d9f99de79a36cf37ebb8 Reviewed-on: https://go-review.googlesource.com/c/go/+/674615 Reviewed-by: David Chase <drchase@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@google.com>
2023-09-13cmd/link: round up default start address to alignmentCherry Mui
If the -R flag (the segment alignment) is specified but the -T flag (start address) is not, currently the default start address may be under-aligned, and some math in the linker may be broken. Round up the start address to align it. Fixes #62064. Change-Id: I3b98c9d0cf7d3cd944b9436a36808899d2e52572 Reviewed-on: https://go-review.googlesource.com/c/go/+/527822 Run-TryBot: Cherry Mui <cherryyz@google.com> Reviewed-by: Than McIntosh <thanm@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
2023-01-31cmd/link: rename ELF struct fields to remove "elf" prefixIan Lance Taylor
While we're here rename setupplt to setupPLT. This is a pure naming change with no semantic change. Change-Id: Ib0312fb6568475b620dab7632438b4d25e4d9cc0 Reviewed-on: https://go-review.googlesource.com/c/go/+/463744 Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> Auto-Submit: Ian Lance Taylor <iant@golang.org>
2023-01-30cmd/link: refactor ELF hooks into ELFArch structIan Lance Taylor
This is a pure cleanup to bring the ELF hooks together. Change-Id: I01d5227c70f30e4a659dcd7904e7c247266e95b1 Reviewed-on: https://go-review.googlesource.com/c/go/+/463981 Auto-Submit: Ian Lance Taylor <iant@golang.org> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Joel Sing <joel@sing.id.au>
2022-12-08cmd/link: fix dynamic interpreter path for musl-based linux amd64cia-rana
Change-Id: Ia07e237647b419b73d6faa11baa32e6176c8b7ce Reviewed-on: https://go-review.googlesource.com/c/go/+/456215 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Than McIntosh <thanm@google.com> Run-TryBot: Cherry Mui <cherryyz@google.com>
2022-08-08cmd/link: detect glibc vs musl ldso at link timeRuss Cox
Doing the test at link time lets us distribute one Linux toolchain that works on both glibc-based and musl-based Linux systems. The old way built a toolchain that only ran on one or the other. Fixes #54197. Change-Id: Iaae8c274c78e1091eee828a720b49646be9bfffe Reviewed-on: https://go-review.googlesource.com/c/go/+/420774 Auto-Submit: Russ Cox <rsc@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Russ Cox <rsc@golang.org>
2020-11-02cmd: remove Go115AMD64Cherry Zhang
Always do aligned jumps now. Change-Id: If68a16fe93c9173c83323a9063465c9bd166eeb8 Reviewed-on: https://go-review.googlesource.com/c/go/+/266857 Trust: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
2020-07-07[dev.link] cmd/link: emit Mach-O relocations in mmapCherry Zhang
Following CL 240399 and CL 240400, do the same for Mach-O. Linking cmd/compile with external linking, name old time/op new time/op delta Asmb2_GC 32.7ms ± 2% 13.5ms ± 6% -58.56% (p=0.008 n=5+5) name old alloc/op new alloc/op delta Asmb2_GC 16.5MB ± 0% 6.4MB ± 0% -61.15% (p=0.008 n=5+5) Change-Id: I0fd7019d8713d1940e5fbbce4ee8eebd926451a1 Reviewed-on: https://go-review.googlesource.com/c/go/+/241178 Reviewed-by: Jeremy Faller <jeremy@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2020-07-05[dev.link] cmd/link: emit ELF relocations in mmapCherry Zhang
Currently, ELF relocations are generated sequentially in the heap and flushed to output file periodically. In fact, in some cases, the output size of the relocation records can be easily computed, as a relocation entry has fixed size. We only need to count the number of relocation records to compute the size. Once the size is computed, we can mmap the output with the proper size, and directly write relocation records in the mapped memory. It also opens the possibility of writing relocations in parallel (not done in this CL). Note: on some architectures, a Go relocation may turn into multiple ELF relocations, which makes size calculation harder. This CL does not handle those cases, and it still writes sequentially in the heap there. Linking cmd/compile with external linking, name old time/op new time/op delta Asmb2 190ms ± 2% 141ms ± 4% -25.74% (p=0.000 n=10+10) name old alloc/op new alloc/op delta Asmb2_GC 66.8MB ± 0% 8.2MB ± 0% -87.79% (p=0.008 n=5+5) name old live-B new live-B delta Asmb2_GC 66.9M ± 0% 55.2M ± 0% -17.58% (p=0.008 n=5+5) Change-Id: If7056bbe909dc90033eef6b9c4891fcca310602c Reviewed-on: https://go-review.googlesource.com/c/go/+/240399 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2020-06-05[dev.link] all: merge branch 'master' into dev.linkCherry Zhang
Merge conflicts are mostly recently changed nm/objdump output format and its tests. Resolved easily (mostly just using the format on master branch). Change-Id: I99d8410a9a02947ecf027d9cae5762861562baf5
2020-06-04all: fix dead links to inferno-os bitbucket repositoryTobias Klauser
Generated using: perl -i -npe 's#inferno-os/src/default#inferno-os/src/master#' $(git grep -l "inferno-os/src/default" | grep -v vendor) Change-Id: I4b6443bd09a8ea4c8aaeb40a1c73520d1f7ca648 Reviewed-on: https://go-review.googlesource.com/c/go/+/235821 Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Austin Clements <austin@google.com>
2020-05-26[dev.link] cmd/link: move asmb2 plan 9 architecture code out of architecturesJeremy Faller
Change-Id: I7a8f8edc4511e3ae0c44ec5017167f14d4c60755 Reviewed-on: https://go-review.googlesource.com/c/go/+/234891 Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2020-05-21[dev.link] cmd/link: remove duplicate asmb codeJeremy Faller
Lots of the architecture specific code for asmb() is very simimar. As such, move to a common function. Change-Id: Id1fd50ee7bfa1bc9978e3f42ad08914b04cd677b Reviewed-on: https://go-review.googlesource.com/c/go/+/234683 Run-TryBot: Jeremy Faller <jeremy@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2020-05-18[dev.link] cmd/link: remove "2" from namesCherry Zhang
Change-Id: I203caaf9cbe7136cf2060de7dc91c28f6ced1ee2 Reviewed-on: https://go-review.googlesource.com/c/go/+/234038 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org>
2020-05-13[dev.link] cmd/link: rename adddynrel2 back to adddynrelThan McIntosh
Minor renaming cleanup to get rid of a couple of old sym.Symbol adddynrel helpers and rename the current crop of adddynrel2 methods/functions back to adddynrel. Change-Id: I67e76decff84d603ef765f3b6a0cd78c7f3743ec Reviewed-on: https://go-review.googlesource.com/c/go/+/233523 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2020-05-01cmd/internal/obj/x86: prevent jumps crossing 32 byte boundariesMark Ryan
This commit adds a new option to the x86 assembler. If the GOAMD64 environment variable is set to alignedjumps (the default) and we're doing a 64 bit build, the assembler will make sure that neither stand alone nor macro-fused jumps will end on or cross 32 byte boundaries. To achieve this, functions are aligned on 32 byte boundaries, rather than 16 bytes, and jump instructions are padded to ensure that they do not cross or end on 32 byte boundaries. Jumps are padded by adding a NOP instruction of the appropriate length before the jump. The commit is likely to result in larger binary sizes when GOAMD64=alignedjumps. On the binaries tested so far, an increase of between 1.4% and 1.5% has been observed. Updates #35881 Co-authored-by: David Chase <drchase@google.com> Change-Id: Ief0722300bc3f987098e4fd92b22b14ad6281d91 Reviewed-on: https://go-review.googlesource.com/c/go/+/219357 Reviewed-by: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
2020-05-01[dev.link] cmd/link: directly use loader.ExtReloc in ELF relocation generationCherry Zhang
Convert the part that uses relocations to use loader.ExtReloc directly. It still uses sym.Symbols for now, but not sym.Relocs. This reduces some memory usage: linking cmd/compile with external linking, name old allocs/op new allocs/op delta Loadlibfull_GC 52.2MB ± 0% 13.9MB ± 0% -73.40% (p=0.008 n=5+5) name old live-B new live-B delta Loadlibfull_GC 75.5M ± 0% 61.9M ± 0% -18.02% (p=0.008 n=5+5) Change-Id: I317ecbf516063c42b255b2caba310ea6281342d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/231319 Reviewed-by: Jeremy Faller <jeremy@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2020-04-27[dev.link] cmd/link: delete old dodataCherry Zhang
Change-Id: I569bbee235630baad3c35ca0c6598b8bd059307a Reviewed-on: https://go-review.googlesource.com/c/go/+/230311 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2020-04-24[dev.link] cmd/link: begin converting dodata() to loader APIsThan McIntosh
This patch begins the work of converting the linker's dodata phase to work with loader APIs. Passes all.bash on linux/amd64, but hasn't been tested on anything else (more arch-specific code needs to be written). Use of the new dodata() phase is currently gated by a temporary command line flag ("-newdodata"), and there is code in the linker's main routine to insure that we only use the new version for the right GOOS/GOARCH (currently restricted to ELF + AMD64). Change-Id: Ied3966677d2a450bc3e0990e0f519b3fceaab806 Reviewed-on: https://go-review.googlesource.com/c/go/+/229706 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2020-04-06[dev.link] cmd/link: begin converting gentext to loader APIsThan McIntosh
Begin the job of converting the linker's "gentext" phase over to use loader APIs. This patch includes most architectures except for s390x and PPC (these will be added in subsequent patches, since they require a couple of loader changes first). Change-Id: Ic7f55c207dcdbbba657330ef007a72ff7c837416 Reviewed-on: https://go-review.googlesource.com/c/go/+/227017 Reviewed-by: Jeremy Faller <jeremy@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-10-10all: remove nacl (part 3, more amd64p32)Brad Fitzpatrick
Part 1: CL 199499 (GOOS nacl) Part 2: CL 200077 (amd64p32 files, toolchain) Part 3: stuff that arguably should've been part of Part 2, but I forgot one of my grep patterns when splitting the original CL up into two parts. This one might also have interesting stuff to resurrect for any future x32 ABI support. Updates #30439 Change-Id: I2b4143374a253a003666f3c69e776b7e456bdb9c Reviewed-on: https://go-review.googlesource.com/c/go/+/200318 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2019-10-09all: remove the nacl port (part 2, amd64p32 + toolchain)Brad Fitzpatrick
This is part two if the nacl removal. Part 1 was CL 199499. This CL removes amd64p32 support, which might be useful in the future if we implement the x32 ABI. It also removes the nacl bits in the toolchain, and some remaining nacl bits. Updates #30439 Change-Id: I2475d5bb066d1b474e00e40d95b520e7c2e286e1 Reviewed-on: https://go-review.googlesource.com/c/go/+/200077 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2019-04-19cmd/link: mmap output fileCherry Zhang
Use mmap for writing most of the output file content, specifically, the sections and segments. After layout, we already know the sizes and file offsets for the sections and segments. So we can just write the bytes by copying to a mmap'd backing store. The writing of the output file is split into two parts. The first part writes the sections and segments to the mmap'd region. The second part writes some extra content, for which we don't know the size, so we use direct file IO. This is in preparation for mmap'ing input files read-only. Change-Id: I9f3b4616a9f96bfd5c940d74c50aacd6d330f7d2 Reviewed-on: https://go-review.googlesource.com/c/go/+/170738 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
2019-03-01cmd/link: remove unused flag -D (FlagDataAddr)Alex Tokarev
FlagDataAddr is a vestige from git commit 0cafb9e (2008; no Gerrit CL number). It was never used but unfortunately setting it would cause a spurious warning: warning: -D<value> is ignored because of -R0x1000 yet if -R was unset e.g. -R=0, the linker would crash with a divide by zero runtime panic. Fixes #28921 Change-Id: Ia910399bc269337a9a860f3a26cd48fae6e62724 Reviewed-on: https://go-review.googlesource.com/c/151021 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2017-10-21cmd/link: move Headtype global to ctxtDavid Crawshaw
For #22095 Change-Id: Idcfdfe8a94db8626392658bb93429454238f648a Reviewed-on: https://go-review.googlesource.com/70835 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2017-10-04cmd/link: remove coutbuf global variableDavid Crawshaw
Begin passing coutbuf by as a parameter. To make the initial plumbing pass easier, it is also a field in the standard ctxt parameter. Consolidate the byte writing functions into the OutBuf object. The result is less architecture-dependent initialization. To avoid plumbing out everywhere we want to report an error, move handling of out file deletion to an AtExit function. For #22095 Change-Id: I0863695241562e0662ae3669666c7922b8c846f9 Reviewed-on: https://go-review.googlesource.com/67318 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2017-10-03cmd/link: remove SysArch global variableDavid Crawshaw
For #22095 Change-Id: I9d1f0d93f8fd701a24af826dc903eea2bc235de2 Reviewed-on: https://go-review.googlesource.com/67317 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2017-04-19cmd/internal/objabi: extract shared functionality from objMatthew Dempsky
Now only cmd/asm and cmd/compile depend on cmd/internal/obj. Changing the assembler backends no longer requires reinstalling cmd/link or cmd/addr2line. There's also now one canonical definition of the object file format in cmd/internal/objabi/doc.go, with a warning to update all three implementations. objabi is still something of a grab bag of unrelated code (e.g., flag and environment variable handling probably belong in a separate "tool" package), but this is still progress. Fixes #15165. Fixes #20026. Change-Id: Ic4b92fac7d0d35438e0d20c9579aad4085c5534c Reviewed-on: https://go-review.googlesource.com/40972 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
2017-03-30cmd/internal/obj, cmd/link: remove Hwindowsgui everywhereAlex Brainman
Hwindowsgui has the same meaning as Hwindows - build PE executable. So use Hwindows everywhere. Change-Id: I2cae5777f17c7bc3a043dfcd014c1620cc35fc20 Reviewed-on: https://go-review.googlesource.com/38761 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2017-02-16cmd/link: delay calculating pe file parameters after Linkmode is setAlex Brainman
For #10776. Change-Id: Id64a7e35c7cdcd9be16cbe3358402fa379090e36 Reviewed-on: https://go-review.googlesource.com/36975 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2017-02-16cmd/link: set pe section and file alignment to 0 during external linkingAlex Brainman
This is what gcc does when it generates object files. And it is easier to count everything, when it starts from 0. Make go linker do the same. gcc also does not output IMAGE_OPTIONAL_HEADER or PE64_IMAGE_OPTIONAL_HEADER for object files. Perhaps we should do the same, but not in this CL. For #10776. Change-Id: I9789c337648623b6cfaa7d18d1ac9cef32e180dc Reviewed-on: https://go-review.googlesource.com/36974 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-10-28cmd/link: put text at address 0x1000000 on darwin/amd64Cherry Zhang
Apparently on macOS Sierra LLDB thinks /usr/lib/dyld is mapped at address 0, even if Go code starts at 0x1000, and it looks up addresses from dyld which shadows Go symbols. Move Go binary at a higher address to avoid clash. Fixes #17463. Re-enable TestLldbPython. Change-Id: I89ca6f3ee48aa6da9862bfa0c2da91477cc93255 Reviewed-on: https://go-review.googlesource.com/32185 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Quentin Smith <quentin@golang.org>
2016-10-19cmd/link, cmd/internal/obj: stop exporting various namesIan Lance Taylor
Just happened to notice that these names (funcAlign and friends) are never referenced outside their package, so no need to export them. Change-Id: I4bbdaa4b0ef330c3c3ef50a2ca39593977a83545 Reviewed-on: https://go-review.googlesource.com/31496 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-09-16cmd/link: skip arch-specific main functionDavid Crawshaw
Add some notes to main.go on what happens where. Change-Id: I4fb0b6c280e5f990ddc5d749267372b86870af6d Reviewed-on: https://go-review.googlesource.com/28970 TryBot-Result: Gobot Gobot <gobot@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-09-16cmd/link: attempt to rationalize linkmode initDavid Crawshaw
This CL gives Linkmode a type, switches it to the standard flag handling mechanism, and deduplicates some logic. There is a semantic change in this CL. Previously if a link was invoked explicitly with -linkmode=internal, any condition that forced external linking would silently override this and use external linking. Instead it now fails with a reason why. I believe this is an improvement, but will change it back if there's disagreement. Fixes #12848 Change-Id: Ic80e341fff65ecfdd2b6fdd6079674cc7210fc5f Reviewed-on: https://go-review.googlesource.com/28971 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-09-16cmd/link: -buildmode=plugin support for linuxDavid Crawshaw
This CL contains several linker changes to support creating plugins. It collects the exported plugin symbols provided by the compiler and includes them in the moduledata. It treats a binary as being dynamically linked if it imports the plugin package. This lets the dynamic linker de-duplicate symbols. Change-Id: I099b6f38dda26306eba5c41dbe7862f5a5918d95 Reviewed-on: https://go-review.googlesource.com/27820 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-09-11cmd/link: optimize TLS IE to LE in build mode PIEDavid Crawshaw
When cmd/compile generates position-independent code on linux (the -shared flag), it refers to runtime.tlsg as a TLS IE variable. When cmd/link is linking a PIE executable internally, all TLS IE relocations are generated by cmd/compile, and the variable they refer to, runtime.tlsg, is local to the binary. This means we can optimize this particular IE case to LE, and thus implement IE support when internally linking. To do this optimization in the linker, we need to rewrite the PC-relative MOVD to a constant load. This may seem like an unconscionable act born of enthusiasm, but it turns out this is standard operating procedure for linkers. GNU gold does exactly the same optimization. I spent some time reading it and documented at least one missing feature from this version. Part of adding PIE internal linking on linux/amd64. Change-Id: I1eb068d0ec774724944c6b308aa5084582ecde0b Reviewed-on: https://go-review.googlesource.com/28540 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-09-10cmd: fix format strings used with obj.HeadtypeJosh Bleecher Snyder
Found by vet. Introduced by CL 28853. Change-Id: I3199e0cbdb1c512ba29eb7e4d5c1c98963f5a954 Reviewed-on: https://go-review.googlesource.com/28957 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2016-09-09cmd: use obj.GOOS, obj.GOARCH, etcDavid Crawshaw
As cmd/internal/obj is coordinating the definition of GOOS, GOARCH, etc across the compiler and linker, turn its functions into globals and use them everywhere. Change-Id: I5db5addda3c6b6435c37fd5581c7c3d9a561f492 Reviewed-on: https://go-review.googlesource.com/28854 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2016-09-09cmd/link, cmd/internal/obj: give Headtype a typeDavid Crawshaw
Separate out windows/windowsgui properly so we are not encoding some of the Headtype value in a separate headstring global. Remove one of the two copies of the variable from cmd/link. Remove duplicate string to headtype list. Change-Id: Ifa20fb9652a1dc95161e154aac11f15ad0f709d0 Reviewed-on: https://go-review.googlesource.com/28853 Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-08-29all: fix obsolete inferno-os linksEmmanuel Odeke
Fixes #16911. Fix obsolete inferno-os links, since code.google.com shutdown. This CL points to the right files by replacing http://code.google.com/p/inferno-os/source/browse with https://bitbucket.org/inferno-os/inferno-os/src/default To implement the change I wrote and ran this script in the root: $ grep -Rn 'http://code.google.com/p/inferno-os/source/browse' * \ | cut -d":" -f1 | while read F;do perl -pi -e \ 's/http:\/\/code.google.com\/p\/inferno-os\/source\/browse/https:\/\/bitbucket.org\/inferno-os\/inferno-os\/src\/default/g' $F;done I excluded any cmd/vendor changes from the commit. Change-Id: Iaaf828ac8f6fc949019fd01832989d00b29b6749 Reviewed-on: https://go-review.googlesource.com/27994 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-08-26cmd/link: make DynlinkingGo a methodDavid Crawshaw
This will allow it to depend on whether plugin.Open is a symbol to be linked in. Change-Id: Ie9aa4216f2510fe8b10bc4665c8b19622b7122ea Reviewed-on: https://go-review.googlesource.com/27819 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-08-22cmd/link: turn some globals into flag pointer variablesMichael Matloob
This moves many of the flag globals into main and assigns them to their flag.String/Int64/... directly. Updates #16818 Change-Id: Ibbff44a273bbc5cb7228e43f147900ee8848517f Reviewed-on: https://go-review.googlesource.com/27473 Reviewed-by: David Crawshaw <crawshaw@golang.org>
2016-08-21cmd/link: use standard library flag package where possibleMichael Matloob
The obj library's flag functions are (mostly) light wrappers around the standard library flag package. Use the flag package directly where possible. Most uses of the 'count'-type flags (except for -v) only check against 0, so they can safely be replaced by bools. Only -v and the flagfns haven't been replaced. Debug has been turned into a slice of bools rather than ints. There was a copy of the -v verbosity in ctxt.Debugvlog, so don't use Debug['v'] and just use ctxt.Debugvlog. Updates #16818 Change-Id: Icf6473a4823c9d35513bbd0c34ea02d5676d782a Reviewed-on: https://go-review.googlesource.com/27471 Run-TryBot: Michael Matloob <matloob@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2016-08-21cmd/link/internal: remove global Ctxt variableMichael Matloob
This change threads the *ld.Link Ctxt variable through code in arch-specific packages. This removes all remaining uses of Ctxt, so remove the global variable too. This CL continues the work in golang.org/cl/27408 Updates #16818 Change-Id: I5f4536847a1825fd0b944824e8ae4e122ec0fb78 Reviewed-on: https://go-review.googlesource.com/27459 Run-TryBot: Michael Matloob <matloob@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-08-21cmd/link/internal: thread *ld.Link through callsMichael Matloob
Ctxt is a global defined in cmd/link/internal/ld of type *ld.Link. Start threading a *ld.Link through function calls instead of relying on the global variable. Ctxt is still used as a global by the architecture-specific packages, but I plan to fix that in a subsequent CL. Change-Id: I77a3a58bd396fafd959fa1d8b1c83008a9f5a7fb Reviewed-on: https://go-review.googlesource.com/27408 Run-TryBot: Michael Matloob <matloob@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Michael Hudson-Doyle <michael.hudson@canonical.com>
2016-05-02all: make copyright headers consistent with one space after periodEmmanuel Odeke
Follows suit with https://go-review.googlesource.com/#/c/20111. Generated by running $ grep -R 'Go Authors. All' * | cut -d":" -f1 | while read F;do perl -pi -e 's/Go Authors. All/Go Authors. All/g' $F;done The code in cmd/internal/unvendor wasn't changed. Fixes #15213 Change-Id: I4f235cee0a62ec435f9e8540a1ec08ae03b1a75f Reviewed-on: https://go-review.googlesource.com/21819 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-04-07cmd: add new common architecture representationMatthew Dempsky
Information about CPU architectures (e.g., name, family, byte ordering, pointer and register size) is currently redundantly scattered around the source tree. Instead consolidate the basic information into a single new package cmd/internal/sys. Also, introduce new sys.I386, sys.AMD64, etc. names for the constants '8', '6', etc. and replace most uses of the latter. The notable exceptions are a couple of error messages that still refer to the old char-based toolchain names and function reltype in cmd/link. Passes toolstash/buildall. Change-Id: I8a6f0cbd49577ec1672a98addebc45f767e36461 Reviewed-on: https://go-review.googlesource.com/21623 Reviewed-by: Michael Hudson-Doyle <michael.hudson@canonical.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-03-31cmd/link: remove -H elf flagMatthew Dempsky
We create appropriate ELF files automatically based on GOOS. There's no point in supporting -H elf flag, particularly since we need to emit different flavors of ELF depending on GOOS anyway. If that weren't reason enough, -H elf appears to be broken since at least Go 1.4. At least I wasn't able to find a way to make use of it. As best I can tell digging through commit history, -H elf is just an artifact leftover from Plan 9's 6l linker. Change-Id: I7393caaadbc60107bbd6bc99b976a4f4fe6b5451 Reviewed-on: https://go-review.googlesource.com/21343 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>