aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld/ldelf.c
AgeCommit message (Collapse)Author
2015-03-01cmd/5l etc: replace C code with Go codeRuss Cox
mv cmd/new5l cmd/5l and so on. Minimal changes to cmd/dist and cmd/go to keep things building. More can be deleted in followup CLs. Change-Id: I1449eca7654ce2580d1f413a56dc4a75f3d4618b Reviewed-on: https://go-review.googlesource.com/6361 Reviewed-by: Rob Pike <r@golang.org>
2015-03-01cmd/ld: clean for c2goRuss Cox
Change-Id: Iaab2be9a1919f2fa9dbc61a5b7fbf99bcd0712a9 Reviewed-on: https://go-review.googlesource.com/6332 Reviewed-by: Rob Pike <r@golang.org> Reviewed-by: Minux Ma <minux@golang.org>
2015-02-13cmd/ld: make cmd/ld a real libraryRuss Cox
Make cmd/ld a real library invoked by the individual linkers. There are no reverse symbol references anymore (symbols referred to in cmd/ld but defined in cmd/5l etc). This means that in principle we could do an automatic conversion of these to Go, as a stopgap until cmd/link is done or as a replacement for cmd/link. Change-Id: I4a94570257a3a7acc31601bfe0fad9dea0aea054 Reviewed-on: https://go-review.googlesource.com/4649 Reviewed-by: Rob Pike <r@golang.org>
2015-01-07cmd/9l: support internal linkingAustin Clements
This implements the ELF relocations and dynamic linking tables necessary to support internal linking on ppc64. It also marks ppc64le ELF files as ABI v2; failing to do this doesn't seem to confuse the loader, but it does confuse libbfd (and hence gdb, objdump, etc). Change-Id: I559dddf89b39052e1b6288a4dd5e72693b5355e4 Reviewed-on: https://go-review.googlesource.com/2006 Reviewed-by: Russ Cox <rsc@golang.org>
2015-01-07cmd/ld: support 2 byte relocationsAustin Clements
ppc64 has a bunch of these. Change-Id: I3b93ed2bae378322a8dec036b1681e520b56ff53 Reviewed-on: https://go-review.googlesource.com/2003 Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-by: Minux Ma <minux@golang.org>
2015-01-07cmd/ld: decode local entry offset from ppc64 symbolsAustin Clements
ppc64 function symbols have both a global entry point and a local entry point, where the difference is stashed in sym.other. We'll need this information to generate calls to ELF ABI functions. Change-Id: Ibe343923f56801de7ebec29946c79690a9ffde57 Reviewed-on: https://go-review.googlesource.com/2002 Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-by: Minux Ma <minux@golang.org>
2014-12-26cmd/ld: put .bss from external objects into real .bss sectionShenghou Ma
Fixes #9359. Change-Id: Iba62935b5a14de23d914f433a09a40417d7e88ed Signed-off-by: Shenghou Ma <minux@golang.org> Reviewed-on: https://go-review.googlesource.com/1889 Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2014-12-22cmd/ld: clean up nested if when loading bind local symsAustin Clements
Change-Id: I15269722ca3d2654a9dd7a3f8a89ad375dc9bee0 Reviewed-on: https://go-review.googlesource.com/1759 Reviewed-by: Russ Cox <rsc@golang.org>
2014-12-05all: power64 is now ppc64Russ Cox
Fixes #8654. LGTM=austin R=austin CC=golang-codereviews https://golang.org/cl/180600043
2014-10-22[dev.power64] all: merge default into dev.power64Austin Clements
This brings dev.power64 up-to-date with the current tip of default. go_bootstrap is still panicking with a bad defer when initializing the runtime (even on amd64). LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/152570049
2014-10-20cmd/cgo: disable clang's integrated assemblerDave Cheney
Fixes #8348. Clang's internal assembler (introduced by default in clang 3.4) understands the .arch directive, but doesn't change the default value of -march. This causes the build to fail when we use BLX (armv5 and above) when clang is compiled for the default armv4t architecture (which appears to be the default on all the distros I've used). This is probably a clang bug, so work around it for the time being by disabling the integrated assembler when compiling the cgo assembly shim. This CL also includes a small change to ldelf.c which was required as clang 3.4 and above generate more weird symtab entries. LGTM=iant R=golang-codereviews, iant CC=golang-codereviews https://golang.org/cl/156430044
2014-10-06cmd/ld: ignore .Linfo_stringNN variables in clang .o filesRuss Cox
http://build.golang.org/log/c7a91b6eac8f8daa2bd17801be273e58403a15f2 # cmd/pprof /linux-386-clang-9115aad1dc4a/go/pkg/linux_386/net.a(_all.o): sym#16: ignoring .Linfo_string0 in section 16 (type 0) /linux-386-clang-9115aad1dc4a/go/pkg/linux_386/net.a(_all.o): sym#17: ignoring .Linfo_string1 in section 16 (type 0) /linux-386-clang-9115aad1dc4a/go/pkg/linux_386/net.a(_all.o): sym#18: ignoring .Linfo_string2 in section 16 (type 0) /linux-386-clang-9115aad1dc4a/go/pkg/linux_386/net.a(_all.o): sym#20: ignoring .Linfo_string0 in section 16 (type 0) /linux-386-clang-9115aad1dc4a/go/pkg/linux_386/net.a(_all.o): sym#21: ignoring .Linfo_string1 in section 16 (type 0) ... I don't know what these are. Let's ignore them and see if we get any further. TBR=iant CC=golang-codereviews https://golang.org/cl/155030043
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-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-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: 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
2013-12-09cmd/ld: fix linux/386 buildRuss Cox
TBR=iant CC=golang-dev https://golang.org/cl/39400044
2013-12-08liblink: create new library based on linker codeRuss Cox
There is an enormous amount of code moving around in this CL, but the code is the same, and it is invoked in the same ways. This CL is preparation for the new linker structure, not the new structure itself. The new library's definition is in include/link.h. The main change is the use of a Link structure to hold all the linker-relevant state, replacing the smattering of global variables. The Link structure should both make it clearer which state must be carried around and make it possible to parallelize more easily later. The main body of the linker has moved into the architecture-independent cmd/ld directory. That includes the list of known header types, so the distinction between Hplan9x32 and Hplan9x64 is removed (no other header type distinguished 32- and 64-bit formats), and code for unused formats such as ipaq kernels has been deleted. The code being deleted from 5l, 6l, and 8l reappears in liblink or in ld. Because multiple files are being merged in the liblink directory, it is not possible to show the diffs nicely in hg. The Prog and Addr structures have been unified into an architecture-independent form and moved to link.h, where they will be shared by all tools: the assemblers, the compilers, and the linkers. The unification makes it possible to write architecture-independent traversal of Prog lists, among other benefits. The Sym structures cannot be unified: they are too fundamentally different between the linker and the compilers. Instead, liblink defines an LSym - a linker Sym - to be used in the Prog and Addr structures, and the linker now refers exclusively to LSyms. The compilers will keep using their own syms but will fill out the corresponding LSyms in the Prog and Addr structures. Although code from 5l, 6l, and 8l is now in a single library, the code has been arranged so that only one architecture needs to be linked into a particular program: 5l will not contain the code needed for x86 instruction layout, for example. The object file writing code in liblink/obj.c is from cmd/gc/obj.c. Preparation for golang.org/s/go13linker work. This CL does not build by itself. It depends on 35740044 and will be submitted at the same time. R=iant CC=golang-dev https://golang.org/cl/35790044
2013-03-10cmd/ld: replace dynimpname with extnameRuss Cox
Dynimpname was getting too confusing. Replace flag-like checks with tests of s->type. R=ken2 CC=golang-dev https://golang.org/cl/7594046
2013-03-07cmd/ld: host linking support for linux/amd64Russ Cox
Still to do: non-linux and non-amd64. It may work on other ELF-based amd64 systems too, but untested. "go test -ldflags -hostobj $GOROOT/misc/cgo/test" passes. Much may yet change, but this seems a reasonable checkpoint. R=iant CC=golang-dev https://golang.org/cl/7369057
2013-02-28cmd/ld: fix symbol table sortingRuss Cox
runtime: double-check that symbol table is sorted If the symbol table is unsorted, the binary search in findfunc will not find its func, which will make stack traces stop early. When the garbage collector starts using the stack tracer, that would be a serious problem. The unsorted symbol addresses came from from two things: 1. The symbols in an ELF object are not necessarily sorted, so sort them before adding them to the symbol list. 2. The __i686.get_pc_thunk.bx symbol is present in multiple object files and was having its address adjusted multiple times, producing an incorrect address in the symbol table. R=golang-dev, iant CC=golang-dev https://golang.org/cl/7440044
2012-10-30cmd/ld: handle weak symbolsShenghou Ma
compiler_rt introduces a weak and hidden symbol compilerrt_abort_impl into our pre-linked _all.o object, we have to handle it. Fixes #4273. R=iant, rsc, r CC=golang-dev https://golang.org/cl/6783050
2012-10-08cmd/ld, cmd/5l: support R_ARM_PC24 and R_ARM_JUMP24, fix R_ARM_CALLShenghou Ma
1. R_ARM_CALL can also be used to call a PLT entry 2. add support for R_ARM_PC24 and R_ARM_JUMP24 3. refactor, remove D_PLT32 in favor of D_CALL Fixes #4006. R=rsc, dave CC=fullung, golang-dev https://golang.org/cl/6622057
2012-09-20cmd/ld: consistent binary for cgo programsShenghou Ma
We use pkg path instead of file name (which contains $WORK) in section symbols names. R=golang-dev, fullung, rsc, iant CC=golang-dev https://golang.org/cl/6445085
2012-08-21cmd/ld: skip R_*_NONE relocations, fix Linux/386 build againShenghou Ma
The last fix was wrong w.r.t C's operator precedence, and it also failed to really skip the NONE relocation. The offending R_386_NONE relocation is a absolute relocation in section .eh_frame. TBR=golang-dev CC=golang-dev https://golang.org/cl/6463058
2012-08-17cmd/ld: explicitly ignore R_*_NONE relocation to fix buildShenghou Ma
I don't know why this relocation is used. R=golang-dev, iant CC=golang-dev https://golang.org/cl/6464070
2012-07-30cmd/5l, cmd/ld: add support for R_ARM_GOT_PRELShenghou Ma
Android NDK's gcc 4.6 generates this relocation for runtime/cgo. R=rsc CC=golang-dev https://golang.org/cl/6450056
2012-05-23cmd/ld: fix Linux/ARM buildShenghou Ma
CL 5823055 removed a line introduced in Linux/ARM cgo support. Because readsym() now returns nil for "$a", "$d" mapping symbols, no matter the settings of `needSym', we still have to guard against them in ldelf(). R=golang-dev, dave, rsc CC=golang-dev https://golang.org/cl/6220073
2012-05-23cmd/ld, cmd/6l, cmd/8l, cmd/5l: fix hidden/local symbol import for ELF systemsShenghou Ma
Introduce a newsym() to cmd/lib.c to add a symbol but don't add them to hash table. Introduce a new bit flag SHIDDEN and bit mask SMASK to handle hidden and/or local symbols in ELF symbol tables. Though we still need to order the symbol table entries correctly. Fix for issue 3261 comment #9. For CL 5822049. R=iant, rsc CC=golang-dev https://golang.org/cl/5823055
2012-05-04cmd/5l, cmd/ld: dynamic linking library supportShenghou Ma
Part 1 of CL 5601044 (cgo: Linux/ARM support) Limitation: doesn't support thumb library yet. R=golang-dev, dave, rsc CC=golang-dev https://golang.org/cl/5991065
2011-11-30ld: align ELF data sectionsIan Lance Taylor
fixes #2506 R=rsc, iant CC=golang-dev https://golang.org/cl/5440066
2011-07-25ld: fix build on Plan 9Lucio De Re
ld/data.c: . Format specifier with corresponding cast to cater for all architectures (llux and vlong). ld/ldelf.c: ld/ldmacho.c: . Missing "pn" argument in diag() calls. ld/ldpe.c: . Dropped "sym->sectnum" in diag() call. . Typo in a comment. ld/lib.h: . Added varargck pragma for "O". R=rsc CC=golang-dev https://golang.org/cl/4749042
2011-06-218l: more fixes for Plan 9Lucio De Re
Once these changes are effected, it is possible to construct "8l" native on a (386?) Plan 9 system, albeit with assistance from modules such as mkfiles that are not (yet) included in any public patches. 8l/asm.c: . Corrected some format qualifiers. 8l/list.c: . Cast a print() argument to (int) to match the given format. It may be possible to change the format (%R), but I have not looked into it. 8l/obj.c: . Removed some unused code. 8l/span.c: . Removed unnecessary incrementation on "bp". . Corrected some format qualifiers. ld/data.c: . Corrected some format qualifiers. . Cast print argument to (int): used as field size. . Use braces to suppress warning about empty if() statements. ld/dwarf.c: . Trivial spelling mistake in comment. ld/ldelf.c: . Added USED() statements to silence warnings. . Dropped redundant address (&) operators. . corrected some format qualifiers. . Cast to (int) for switch selection variable. ld/macho.c: . Added USED() statements to silence warnings. ld/ldpe.c: . Added USED() statements to silence warnings. . More careful use of "sect" variable. . Corrected some format qualifiers. . Removed redundant assignments. . Minor fix dropped as it was submitted separately. ld/pe.c: . Dropped <time.h> which is now in <u.h>. . Dropped redundant address (&) operators. . Added a missing variable initialisation. ld/symtab.c: . Added USED() statements to silence warnings. . Removed redundant incrementation. . Corrected some format qualifiers. All the above have been tested against a (very) recent release and do not seem to trigger any regressions. All review suggestions have been incorporated. R=rsc CC=golang-dev https://golang.org/cl/4633043
2011-04-14for GCC4.6: fix a bunch of set-and-not-used errors.Rob Pike
R=rsc CC=golang-dev https://golang.org/cl/4406048
2011-01-06ld: Permit an ELF symbol to be exported in the dynamic symbol table.Ian Lance Taylor
This permits exporting crosscall2 from the runtime/cgo package. R=rsc CC=golang-dev https://golang.org/cl/3885041
2010-12-17ld: allow relocations pointing at ELF .bss symbolsRuss Cox
R=r, r2 CC=golang-dev https://golang.org/cl/3710042
2010-12-13ld: allow .o files with no symbolsRuss Cox
Don't crash in dwarf for foreign functions. R=ken2 CC=golang-dev https://golang.org/cl/3576043
2010-12-085l (and 6l, 8l, ld): more arm build fixesRuss Cox
R=ken2 CC=golang-dev https://golang.org/cl/3521041
2010-12-08ld: reading of ELF object filesRuss Cox
R=iant CC=golang-dev https://golang.org/cl/3507041