aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld
AgeCommit message (Collapse)Author
2014-09-15cmd/ld: document that -X overwrites initialized variablesJosh Bleecher Snyder
Fixes #7626. LGTM=iant R=rsc, iant CC=golang-codereviews https://golang.org/cl/144870045
2014-09-08build: adjustments for move from src/pkg to srcRuss Cox
This CL adjusts code referring to src/pkg to refer to src. Immediately after submitting this CL, I will submit a change doing 'hg mv src/pkg/* src'. That change will be too large to review with Rietveld but will contain only the 'hg mv'. This CL will break the build. The followup 'hg mv' will fix it. For more about the move, see golang.org/s/go14nopkg. LGTM=r R=r CC=golang-codereviews https://golang.org/cl/134570043
2014-08-31cmd/ld: diagnose Go calling CRuss Cox
For example: go build -ldflags -C cmd/go 2>&1 | awk '{print $NF}' | sort | uniq -c | sort -nr LGTM=khr R=khr, josharian CC=golang-codereviews https://golang.org/cl/135170044
2014-08-27cmd/{ld,link,objdump}, runtime, debug/gosym: move linker-defined symbols ↵Matthew Dempsky
into runtime package Fixes #8092. LGTM=rsc R=iant, rsc CC=golang-codereviews https://golang.org/cl/126790043
2014-08-22cmd/ld: fix undefined behaviour in pcln.cDave Cheney
Update #8527 Fixes, src/cmd/6l/../ld/pcln.c:93:18: runtime error: left shift of negative value -2 LGTM=r R=golang-codereviews, r CC=golang-codereviews https://golang.org/cl/127440043
2014-08-18liblink: use pc-relative addressing for all memory references in amd64 codeRuss Cox
LGTM=rminnich, iant R=golang-codereviews, rminnich, iant CC=golang-codereviews, r https://golang.org/cl/125140043
2014-08-16cmd/ld: fix operator precedenceDave Cheney
Fixes #8480. This CL reapplies CL 114420043. This attempt doesn't blow up when encountering hidden symbols. LGTM=minux R=minux CC=golang-codereviews https://golang.org/cl/128310043
2014-08-16cmd/ld: fix operator precedenceShenghou Ma
LGTM=rsc R=gobot, dave CC=golang-codereviews, iant, rsc https://golang.org/cl/114420043
2014-08-14[dev.power64] cmd/ld, runtime: detect, fix nosplit overflowsRuss Cox
LGTM=minux R=minux CC=golang-codereviews https://golang.org/cl/121690043
2014-08-12[dev.power64] cmd/9g, cmd/gc, cmd/ld: fix build.Shenghou Ma
1. disable nonsplit stack overflow check 2. disable OLROT recognition 3. emit correct instructions for adding offsets to an address LGTM=rsc R=rsc, iant CC=golang-codereviews https://golang.org/cl/123310043
2014-08-12cmd/ld: handle large link base addressesRuss Cox
codeblk and datblk were truncating their arguments to int32. Don't do that. LGTM=dvyukov, rminnich R=iant, dvyukov, rminnich CC=golang-codereviews https://golang.org/cl/126050043
2014-08-11[dev.power64] cmd/ld: add MAXIO back in lib.hShenghou Ma
It was accidentally removed. LGTM=dave R=rsc, iant, dave CC=golang-codereviews https://golang.org/cl/124880043
2014-08-07[dev.power64] cmd/ld: update for power64Shenghou Ma
LGTM=rsc R=rsc, iant CC=golang-codereviews https://golang.org/cl/121380043
2014-08-06undo CL 114420043 / b613f2acdf69Shenghou Ma
Broke freebsd/amd64 due to exposure of a latent bug. ««« original CL description cmd/ld: fix operator precedence LGTM=rsc R=rsc, iant CC=golang-codereviews https://golang.org/cl/114420043 »»» TBR=dfc R=dave CC=golang-codereviews https://golang.org/cl/120630043
2014-08-06cmd/5l, cmd/6l, cmd/8l, cmd/ld: remove unused code, consolidate enumsShenghou Ma
LGTM=rsc R=rsc, iant CC=golang-codereviews https://golang.org/cl/120220043
2014-08-06cmd/ld: fix operator precedenceShenghou Ma
LGTM=rsc R=rsc, iant CC=golang-codereviews https://golang.org/cl/114420043
2014-08-05runtime: remove type.goDmitriy Vyukov
We have an autogenerated version in zruntime_defs. I am not sure what are the consequences as gdb never printed any values for me. But it looks unnecessary to manually duplicate it. LGTM=rsc R=golang-codereviews, rsc CC=golang-codereviews, iant, khr https://golang.org/cl/115660043
2014-07-29cmd/ld: better diagnostics on unaligned symbolsDmitriy Vyukov
Want to see why builders are failing. Then decide whether to rollback or fix. TBR=khr R=khr CC=golang-codereviews https://golang.org/cl/114510043
2014-07-29runtime: simpler and faster GCDmitriy Vyukov
Implement the design described in: https://docs.google.com/document/d/1v4Oqa0WwHunqlb8C3ObL_uNQw3DfSY-ztoA-4wWbKcg/pub Summary of the changes: GC uses "2-bits per word" pointer type info embed directly into bitmap. Scanning of stacks/data/heap is unified. The old spans types go away. Compiler generates "sparse" 4-bits type info for GC (directly for GC bitmap). Linker generates "dense" 2-bits type info for data/bss (the same as stacks use). Summary of results: -1680 lines of code total (-1000+ in mgc0.c only) -25% memory consumption -3-7% binary size -15% GC pause reduction -7% run time reduction LGTM=khr R=golang-codereviews, rsc, christoph, khr CC=golang-codereviews, rlh https://golang.org/cl/106260045
2014-07-26cmd/ld: remove duplicated nuxiinit() call.Shenghou Ma
It is already called by linknew(). LGTM=dave R=rsc, dave CC=golang-codereviews https://golang.org/cl/120760043
2014-07-22cmd/ld: mark hostobj sections as containing no pointersDmitriy Vyukov
Currently they are scanned conservatively. But there is no reason to scan them. C world must not contain pointers into Go heap. Moreover, we don't have enough information to emit write barriers nor update pointers there in future. The immediate need is that it breaks the new GC because these are weird symbols as if with pointers but not necessary pointer aligned. LGTM=rsc R=golang-codereviews, rlh, rsc CC=golang-codereviews, iant, khr https://golang.org/cl/117000043
2014-07-16runtime: convert map implementation to Go.Keith Randall
It's a bit slower, but not painfully so. There is still room for improvement (saving space so we can use nosplit, and removing the requirement for hash/eq stubs). benchmark old ns/op new ns/op delta BenchmarkMegMap 23.5 24.2 +2.98% BenchmarkMegOneMap 14.9 15.7 +5.37% BenchmarkMegEqMap 71668 72234 +0.79% BenchmarkMegEmptyMap 4.05 4.93 +21.73% BenchmarkSmallStrMap 21.9 22.5 +2.74% BenchmarkMapStringKeysEight_16 23.1 26.3 +13.85% BenchmarkMapStringKeysEight_32 21.9 25.0 +14.16% BenchmarkMapStringKeysEight_64 21.9 25.1 +14.61% BenchmarkMapStringKeysEight_1M 21.9 25.0 +14.16% BenchmarkIntMap 21.8 12.5 -42.66% BenchmarkRepeatedLookupStrMapKey32 39.3 30.2 -23.16% BenchmarkRepeatedLookupStrMapKey1M 322353 322675 +0.10% BenchmarkNewEmptyMap 129 136 +5.43% BenchmarkMapIter 137 107 -21.90% BenchmarkMapIterEmpty 7.14 8.71 +21.99% BenchmarkSameLengthMap 5.24 6.82 +30.15% BenchmarkBigKeyMap 34.5 35.3 +2.32% BenchmarkBigValMap 36.1 36.1 +0.00% BenchmarkSmallKeyMap 26.9 26.7 -0.74% LGTM=rsc R=golang-codereviews, dave, dvyukov, rsc, gobot, khr CC=golang-codereviews https://golang.org/cl/99380043
2014-07-16cmd/ld: use count, not upper bound, in type of arrayRob Pike
DWARF says only one is necessary. The count is preferable because it admits 0-length arrays. Update debug/dwarf to handle either form. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/111230044
2014-07-15cmd/ld: change DWARF encoding for array lengthsRob Pike
They can be large, so use a varint encoding rather than only one byte. LGTM=iant, rsc R=rsc, iant CC=golang-codereviews https://golang.org/cl/113180043
2014-07-15cmd/ld: consistently document flags that expect valuesMatthew Dempsky
LGTM=minux, rsc R=golang-codereviews, minux, rsc CC=golang-codereviews https://golang.org/cl/113970044
2014-07-15cmd/ld: generate correct upper bound value for array types.Rob Pike
LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/115820043
2014-07-11cmd/ld: add go-specific dwarf type informationRuss Cox
LGTM=r R=r CC=golang-codereviews https://golang.org/cl/116720043
2014-07-11ld: change DWARF output for structsRob Pike
The debug/dwarf package cannot parse the format generated here, but the format can be changed so it does. After this edit, tweaking the expression defining the offset of a struct field, the dwarf package can parse the tables (again?). LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/105710043
2014-07-07cmd/ld: fix off-by-one in DWARF frame tablesRob Pike
The code generating the .debug_frame section emits pairs of "advance PC", "set SP offset" pseudo-instructions. Before the fix, the PC advance comes out before the SP setting, which means the emitted offset for a block is actually the value at the end of the block, which is incorrect for the block itself. The easiest way to fix this problem is to emit the SP offset before the PC advance. One delicate point: the last instruction to come out is now an "advance PC", which means that if there are padding intsructions after the final RET, they will appear to have a non-zero offset. This is odd but harmless because there is no legal way to have a PC in that range, or to put it another way, if you get here the SP is certainly screwed up so getting the wrong (virtual) frame pointer is the least of your worries. LGTM=iant R=rsc, iant, lvd CC=golang-codereviews https://golang.org/cl/112750043
2014-07-03cmd/go, cmd/ld, runtime, os/user: TLS emulation for androidDavid Crawshaw
Based on cl/69170045 by Elias Naur. There are currently several schemes for acquiring a TLS slot to save the g register. None of them appear to work for android. The closest are linux and darwin. Linux uses a linker TLS relocation. This is not supported by the android linker. Darwin uses a fixed offset, and calls pthread_key_create until it gets the slot it wants. As the runtime loads late in the android process lifecycle, after an arbitrary number of other libraries, we cannot rely on any particular slot being available. So we call pthread_key_create, take the first slot we are given, and put it in runtime.tlsg, which we turn into a regular variable in cmd/ld. Makes android/arm cgo binaries work. LGTM=minux R=elias.naur, minux, dave, josharian CC=golang-codereviews https://golang.org/cl/106380043
2014-07-02build: annotations and modifications for c2goRuss Cox
The main changes fall into a few patterns: 1. Replace #define with enum. 2. Add /*c2go */ comment giving effect of #define. This is necessary for function-like #defines and non-enum-able #defined constants. (Not all compilers handle negative or large enums.) 3. Add extra braces in struct initializer. (c2go does not implement the full rules.) This is enough to let c2go typecheck the source tree. There may be more changes once it is doing other semantic analyses. LGTM=minux, iant R=minux, dave, iant CC=golang-codereviews https://golang.org/cl/106860045
2014-06-26all: remove 'extern register M *m' from runtimeRuss Cox
The runtime has historically held two dedicated values g (current goroutine) and m (current thread) in 'extern register' slots (TLS on x86, real registers backed by TLS on ARM). This CL removes the extern register m; code now uses g->m. On ARM, this frees up the register that formerly held m (R9). This is important for NaCl, because NaCl ARM code cannot use R9 at all. The Go 1 macrobenchmarks (those with per-op times >= 10 µs) are unaffected: BenchmarkBinaryTree17 5491374955 5471024381 -0.37% BenchmarkFannkuch11 4357101311 4275174828 -1.88% BenchmarkGobDecode 11029957 11364184 +3.03% BenchmarkGobEncode 6852205 6784822 -0.98% BenchmarkGzip 650795967 650152275 -0.10% BenchmarkGunzip 140962363 141041670 +0.06% BenchmarkHTTPClientServer 71581 73081 +2.10% BenchmarkJSONEncode 31928079 31913356 -0.05% BenchmarkJSONDecode 117470065 113689916 -3.22% BenchmarkMandelbrot200 6008923 5998712 -0.17% BenchmarkGoParse 6310917 6327487 +0.26% BenchmarkRegexpMatchMedium_1K 114568 114763 +0.17% BenchmarkRegexpMatchHard_1K 168977 169244 +0.16% BenchmarkRevcomp 935294971 914060918 -2.27% BenchmarkTemplate 145917123 148186096 +1.55% Minux previous reported larger variations, but these were caused by run-to-run noise, not repeatable slowdowns. Actual code changes by Minux. I only did the docs and the benchmarking. LGTM=dvyukov, iant, minux R=minux, josharian, iant, dave, bradfitz, dvyukov CC=golang-codereviews https://golang.org/cl/109050043
2014-06-10cmd/ld: fix PC deltas in DWARF line number tableIan Lance Taylor
The putpclcdelta function set the DWARF line number PC to s->value + pcline->pc, which is correct, but the code then set the local variable pc to epc, which can be a different value. This caused the next delta in the DWARF table to be wrong. Fixes #8098. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/104950045
2014-05-21cmd/ld: correctly compute note size on NetBSD.Benny Siegert
Patch from http://gnats.NetBSD.org/48811. LGTM=iant R=golang-codereviews, minux.ma, iant CC=golang-codereviews, tk https://golang.org/cl/94670047
2014-05-20cmd/ld: really import runtime/cgo for external linkIan Lance Taylor
Fixes #8032. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/95580043
2014-05-20cmd/ld: make lldb happy with Mach-O 6.out filesRuss Cox
Apparently all the __DWARF sections need addresses even though they are marked as "do not load from disk". Continue the address numbering from the data segment. With this change: g% lldb helloworld Current executable set to 'helloworld' (x86_64). (lldb) b main.main Breakpoint 1: where = helloworld`main.main + 25 at helloworld.go:12, address = 0x0000000000002019 (lldb) r Process 68509 launched: '/Users/rsc/g/go/src/cmd/6l/helloworld' (x86_64) 1 location added to breakpoint 1 (lldb) Process 68509 stopped * thread #1: tid = 0x8b7a27, 0x0000000000002019 helloworld`main.main + 25 at helloworld.go:12, stop reason = breakpoint 1.2 frame #0: 0x0000000000002019 helloworld`main.main + 25 at helloworld.go:12 9 package main 10 11 func main() { -> 12 print("hello, world\n") 13 } (lldb) bt * thread #1: tid = 0x8b7a27, 0x0000000000002019 helloworld`main.main + 25 at helloworld.go:12, stop reason = breakpoint 1.2 * frame #0: 0x0000000000002019 helloworld`main.main + 25 at helloworld.go:12 (lldb) disas helloworld`main.main at helloworld.go:11: 0x2000: movq %gs:0x8a0, %rcx 0x2009: cmpq (%rcx), %rsp 0x200c: ja 0x2015 ; main.main + 21 at helloworld.go:11 0x200e: callq 0x20da0 ; runtime.morestack00_noctxt at atomic_amd64x.c:28 0x2013: jmp 0x2000 ; main.main at helloworld.go:11 0x2015: subq $0x10, %rsp -> 0x2019: leaq 0x2c2e0, %rbx 0x2021: leaq (%rsp), %rbp 0x2025: movq %rbp, %rdi 0x2028: movq %rbx, %rsi 0x202b: movsq 0x202d: movsq 0x202f: callq 0x10300 ; runtime.printstring at compiler.go:1 0x2034: addq $0x10, %rsp 0x2038: ret 0x2039: addb %al, (%rax) 0x203b: addb %al, (%rax) 0x203d: addb %al, (%rax) (lldb) quit Quitting LLDB will kill one or more processes. Do you really want to proceed: [Y/n] y g% Fixes #7070. LGTM=iant R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/93510043
2014-05-19cmd/ld: abort if (32-bit) address relocation is negative on amd64.Shenghou Ma
Update #7980 This CL make the linker abort for the example program. For Go 1.4, we need to find a general way to handle large memory model programs. LGTM=dave, josharian, iant R=iant, dave, josharian CC=golang-codereviews https://golang.org/cl/91500046
2014-05-06cmd/ld: correct pe section number in symbol tableAlex Brainman
Update #7899 LGTM=iant R=golang-codereviews, rsc, iant CC=golang-codereviews https://golang.org/cl/97920044
2014-04-21cmd/ld: correct addresses in windows pe symbol tableAlex Brainman
This should have been part of 36eb4a62fbb6, but I later discovered that addresses are all wrong. Appropriate test added now. LGTM=r R=golang-codereviews, r CC=golang-codereviews https://golang.org/cl/89470043
2014-04-21runtime, cmd/ld, cmd/5l, run.bash: enable external linking on FreeBSD/ARM.Shenghou Ma
Update #7331 LGTM=dave, iant R=golang-codereviews, dave, gobot, iant CC=golang-codereviews https://golang.org/cl/89520043
2014-04-18cmd/ld: don't delete output binary if not "ordinary" file (redux).Mike Andrews
following on CL https://golang.org/cl/76810045 and issue 7563, i now see there's another "remove(outfile)" a few dozen lines down that also needs fixing. LGTM=iant R=golang-codereviews, iant CC=0intro, golang-codereviews, r https://golang.org/cl/89030043
2014-04-16cmd/ld: don't pass -rdynamic to external linker if -static is usedIan Lance Taylor
Fixes #7800. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/87790051
2014-04-16cmd/ld: restore the call graph dumpAnthony Martin
Before the switch to liblink, the linkers accepted the -c flag to print the call graph. This change restores the functionality. This came in handy when I was trying to audit the use of SSE instructions inside the Plan 9 note handler. LGTM=rsc R=golang-codereviews, bradfitz, rsc CC=golang-codereviews https://golang.org/cl/73990043
2014-04-16cmd/ld: populate pe symbol table with Go symbolsAlex Brainman
Fixes #6936 LGTM=rsc R=golang-codereviews, bradfitz, rsc CC=golang-codereviews https://golang.org/cl/87770048
2014-04-16liblink, cmd/ld: reenable nosplit checking and testRuss Cox
The new code is adapted from the Go 1.2 nosplit code, but it does not have the bug reported in issue 7623: g% go run nosplit.go g% go1.2 run nosplit.go BUG rejected incorrectly: main 0 call f; f 120 linker output: # _/tmp/go-test-nosplit021064539 main.main: nosplit stack overflow 120 guaranteed after split check in main.main 112 on entry to main.f -8 after main.f uses 120 g% Fixes #6931. Fixes #7623. LGTM=iant R=golang-codereviews, iant, ality CC=golang-codereviews, r https://golang.org/cl/88190043
2014-04-16liblink: add leaf bit to object file formatRuss Cox
Without the leaf bit, the linker cannot record the correct frame size in the symbol table, and then stack traces get mangled. (Only for ARM.) Fixes #7338. Fixes #7347. LGTM=iant R=iant CC=golang-codereviews https://golang.org/cl/88550043
2014-04-16liblink: fix incorrect hash collision in lookupRuss Cox
linklookup uses hash(name, v) as the hash table index but then only compares name to find a symbol to return. If hash(name, v1) == hash(name, v2) for v1 != v2, the lookup for v2 will return the symbol with v1. The input routines assume that each symbol is found only once, and then each symbol is added to a linked list, with the list header in the symbol. Adding a symbol to such a list multiple times short-circuits the list the second time it is added, causing symbols to be dropped. The liblink rewrite introduced an elegant, if inefficient, handling of duplicated symbols by creating a dummy symbol to read the duplicate into. The dummy symbols are named .dup with sequential version numbers. With many .dup symbols, eventually there will be a conflict, causing a duplicate list add, causing elided symbols, causing a crash when calling one of the elided symbols. The bug is old (2011) but could not have manifested until the liblink rewrite introduced this heavily duplicated symbol .dup. (See History section below.) 1. Correct the lookup function. 2. Since we want all the .dup symbols to be different, there's no point in inserting them into the table. Call linknewsym directly, avoiding the lookup function entirely. 3. Since nothing can refer to the .dup symbols, do not bother adding them to the list of functions (textp) at all. 4. In lieu of a unit test, introduce additional consistency checks to detect adding a symbol to a list multiple times. This would have caught the short-circuit more directly, and it will detect a variety of double-use bugs, including the one arising from the bad lookup. Fixes #7749. History On April 9, 2011, I submitted CL 4383047, making ld 25% faster. Much of the focus was on the hash table lookup function, and one of the changes was to remove the s->version == v comparison [1]. I don't know if this was a simple editing error or if I reasoned that same name but different v would yield a different hash slot and so the name test alone sufficed. It is tempting to claim the former, but it was probably the latter. Because the hash is an iterated multiply+add, the version ends up adding v*3ⁿ to the hash, where n is the length of the name. A collision would need x*3ⁿ ≡ y*3ⁿ (mod 2²⁴ mod 100003), or equivalently x*3ⁿ ≡ x*3ⁿ + (y-x)*3ⁿ (mod 2²⁴ mod 100003), so collisions will actually be periodic: versions x and y collide when d = y-x satisfies d*3ⁿ ≡ 0 (mod 2²⁴ mod 100003). Since we allocate version numbers sequentially, this is actually about the best case one could imagine: the collision rate is much lower than if the hash were more random. http://play.golang.org/p/TScD41c_hA computes the collision period for various name lengths. The most common symbol in the new linker is .dup, and for n=4 the period is maximized: the 100004th symbol is the first collision. Unfortunately, there are programs with more duplicated symbols than that. In Go 1.2 and before, duplicate symbols were handled without creating a dummy symbol, so this particular case for generating many duplicate symbols could not happen. Go does not use versioned symbols. Only C does; each input file gives a different version to its static declarations. There just aren't enough C files for this to come up in that context. So the bug is old but the realization of the bug is new. [1] https://golang.org/cl/4383047/diff/5001/src/cmd/ld/lib.c LGTM=minux.ma, iant, dave R=golang-codereviews, minux.ma, bradfitz, iant, dave CC=golang-codereviews, r https://golang.org/cl/87910047
2014-04-16cmd/ld: cast PE32 absolute addend to int32.Shenghou Ma
Didn't manage to find a way to write test cases. Fixes #7769. LGTM=iant R=iant CC=golang-codereviews https://golang.org/cl/88000045
2014-04-16cmd/ld: correct comment.Shenghou Ma
LGTM=iant R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/88360044
2014-04-15cmd/ld: record complete runtime-gdb.py path againRuss Cox
This code never got updated after the liblink shuffle. Tested by hand that it works and respects GOROOT_FINAL. The discussion in issue 6963 suggests that perhaps we should just drop runtime-gdb.py entirely, but I am not convinced that is true. It was in Go 1.2 and I don't see a reason not to keep it in Go 1.3. The fact that binaries have not been emitting the reference was just a missed detail in the liblink conversion, not part of a grand plan. Fixes #7506. Fixes #6963. LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews, iant, r https://golang.org/cl/87870048