mirror of https://github.com/golang/go.git
build: fix elf builds
Corrections due to new strict type rules for data+bss. Also disable misc/cgo/cdefstest since you can't compile C code anymore. TBR=iant CC=golang-codereviews https://golang.org/cl/148050044
This commit is contained in:
parent
54111a5893
commit
117a6973cb
|
|
@ -204,10 +204,10 @@ enum
|
||||||
SELFSECT,
|
SELFSECT,
|
||||||
SMACHO, /* Mach-O __nl_symbol_ptr */
|
SMACHO, /* Mach-O __nl_symbol_ptr */
|
||||||
SMACHOGOT,
|
SMACHOGOT,
|
||||||
|
SWINDOWS,
|
||||||
SNOPTRDATA,
|
SNOPTRDATA,
|
||||||
SINITARR,
|
SINITARR,
|
||||||
SDATA,
|
SDATA,
|
||||||
SWINDOWS,
|
|
||||||
SBSS,
|
SBSS,
|
||||||
SNOPTRBSS,
|
SNOPTRBSS,
|
||||||
STLSBSS,
|
STLSBSS,
|
||||||
|
|
|
||||||
|
|
@ -625,6 +625,7 @@ addstrdata(char *name, char *value)
|
||||||
sp = linklookup(ctxt, p, 0);
|
sp = linklookup(ctxt, p, 0);
|
||||||
free(p);
|
free(p);
|
||||||
addstring(sp, value);
|
addstring(sp, value);
|
||||||
|
sp->type = SRODATA;
|
||||||
|
|
||||||
s = linklookup(ctxt, name, 0);
|
s = linklookup(ctxt, name, 0);
|
||||||
s->size = 0;
|
s->size = 0;
|
||||||
|
|
@ -816,9 +817,15 @@ proggenaddsym(ProgGen *g, LSym *s)
|
||||||
proggenskip(g, g->pos, s->value - g->pos);
|
proggenskip(g, g->pos, s->value - g->pos);
|
||||||
g->pos += s->value - g->pos;
|
g->pos += s->value - g->pos;
|
||||||
|
|
||||||
if(s->gotype == nil && s->size >= PtrSize) {
|
// The test for names beginning with . here is meant
|
||||||
|
// to keep .dynamic and .dynsym from turning up as
|
||||||
|
// conservative symbols. They should be marked SELFSECT
|
||||||
|
// and not SDATA, but sometimes that doesn't happen.
|
||||||
|
// Leave debugging the SDATA issue for the Go rewrite.
|
||||||
|
|
||||||
|
if(s->gotype == nil && s->size >= PtrSize && s->name[0] != '.') {
|
||||||
// conservative scan
|
// conservative scan
|
||||||
diag("missing Go type information for global symbol: %s", s->name);
|
diag("missing Go type information for global symbol: %s size %d", s->name, (int)s->size);
|
||||||
if((s->size%PtrSize) || (g->pos%PtrSize))
|
if((s->size%PtrSize) || (g->pos%PtrSize))
|
||||||
diag("proggenaddsym: unaligned conservative symbol %s: size=%lld pos=%lld",
|
diag("proggenaddsym: unaligned conservative symbol %s: size=%lld pos=%lld",
|
||||||
s->name, s->size, g->pos);
|
s->name, s->size, g->pos);
|
||||||
|
|
@ -834,7 +841,7 @@ proggenaddsym(ProgGen *g, LSym *s)
|
||||||
proggenarrayend(g);
|
proggenarrayend(g);
|
||||||
}
|
}
|
||||||
g->pos = s->value + size;
|
g->pos = s->value + size;
|
||||||
} else if(s->gotype == nil || decodetype_noptr(s->gotype) || s->size < PtrSize) {
|
} else if(s->gotype == nil || decodetype_noptr(s->gotype) || s->size < PtrSize || s->name[0] == '.') {
|
||||||
// no scan
|
// no scan
|
||||||
if(s->size < 32*PtrSize) {
|
if(s->size < 32*PtrSize) {
|
||||||
// Emit small symbols as data.
|
// Emit small symbols as data.
|
||||||
|
|
|
||||||
|
|
@ -221,8 +221,10 @@ loadlib(void)
|
||||||
// Provided by the code that imports the package.
|
// Provided by the code that imports the package.
|
||||||
// Since we are simulating the import, we have to provide this string.
|
// Since we are simulating the import, we have to provide this string.
|
||||||
cgostrsym = "go.string.\"runtime/cgo\"";
|
cgostrsym = "go.string.\"runtime/cgo\"";
|
||||||
if(linkrlookup(ctxt, cgostrsym, 0) == nil)
|
if(linkrlookup(ctxt, cgostrsym, 0) == nil) {
|
||||||
addstrdata(cgostrsym, "runtime/cgo");
|
addstrdata(cgostrsym, "runtime/cgo");
|
||||||
|
linklookup(ctxt, cgostrsym, 0)->type = SRODATA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(linkmode == LinkAuto) {
|
if(linkmode == LinkAuto) {
|
||||||
|
|
|
||||||
11
src/run.bash
11
src/run.bash
|
|
@ -167,10 +167,13 @@ esac
|
||||||
# This tests cgo -cdefs. That mode is not supported,
|
# This tests cgo -cdefs. That mode is not supported,
|
||||||
# so it's okay if it doesn't work on some systems.
|
# so it's okay if it doesn't work on some systems.
|
||||||
# In particular, it works badly with clang on OS X.
|
# In particular, it works badly with clang on OS X.
|
||||||
[ "$CGO_ENABLED" != 1 ] || [ "$GOOS" == darwin ] ||
|
# It doesn't work at all now that we disallow C code
|
||||||
(xcd ../misc/cgo/testcdefs
|
# outside runtime. Once runtime has no C code it won't
|
||||||
./test.bash || exit 1
|
# even be necessary.
|
||||||
) || exit $?
|
# [ "$CGO_ENABLED" != 1 ] || [ "$GOOS" == darwin ] ||
|
||||||
|
# (xcd ../misc/cgo/testcdefs
|
||||||
|
# ./test.bash || exit 1
|
||||||
|
# ) || exit $?
|
||||||
|
|
||||||
[ "$CGO_ENABLED" != 1 ] || [ "$GOOS" == darwin ] ||
|
[ "$CGO_ENABLED" != 1 ] || [ "$GOOS" == darwin ] ||
|
||||||
(xcd ../misc/cgo/testgodefs
|
(xcd ../misc/cgo/testgodefs
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
#include "runtime.h"
|
#include "runtime.h"
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
// Look up symbols in the Linux vDSO.
|
// Look up symbols in the Linux vDSO.
|
||||||
|
|
||||||
|
|
@ -171,14 +172,18 @@ struct vdso_info {
|
||||||
Elf64_Verdef *verdef;
|
Elf64_Verdef *verdef;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#pragma dataflag NOPTR
|
||||||
static version_key linux26 = { (byte*)"LINUX_2.6", 0x3ae75f6 };
|
static version_key linux26 = { (byte*)"LINUX_2.6", 0x3ae75f6 };
|
||||||
|
|
||||||
// initialize with vsyscall fallbacks
|
// initialize with vsyscall fallbacks
|
||||||
|
#pragma dataflag NOPTR
|
||||||
void* runtime·__vdso_time_sym = (void*)0xffffffffff600400ULL;
|
void* runtime·__vdso_time_sym = (void*)0xffffffffff600400ULL;
|
||||||
|
#pragma dataflag NOPTR
|
||||||
void* runtime·__vdso_gettimeofday_sym = (void*)0xffffffffff600000ULL;
|
void* runtime·__vdso_gettimeofday_sym = (void*)0xffffffffff600000ULL;
|
||||||
|
#pragma dataflag NOPTR
|
||||||
void* runtime·__vdso_clock_gettime_sym = (void*)0;
|
void* runtime·__vdso_clock_gettime_sym = (void*)0;
|
||||||
|
|
||||||
#define SYM_KEYS_COUNT 3
|
#pragma dataflag NOPTR
|
||||||
static symbol_key sym_keys[] = {
|
static symbol_key sym_keys[] = {
|
||||||
{ (byte*)"__vdso_time", 0xa33c485, &runtime·__vdso_time_sym },
|
{ (byte*)"__vdso_time", 0xa33c485, &runtime·__vdso_time_sym },
|
||||||
{ (byte*)"__vdso_gettimeofday", 0x315ca59, &runtime·__vdso_gettimeofday_sym },
|
{ (byte*)"__vdso_gettimeofday", 0x315ca59, &runtime·__vdso_gettimeofday_sym },
|
||||||
|
|
@ -301,7 +306,7 @@ vdso_parse_symbols(struct vdso_info *vdso_info, int32 version)
|
||||||
if(vdso_info->valid == false)
|
if(vdso_info->valid == false)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for(i=0; i<SYM_KEYS_COUNT; i++) {
|
for(i=0; i<nelem(sym_keys); i++) {
|
||||||
for(chain = vdso_info->bucket[sym_keys[i].sym_hash % vdso_info->nbucket];
|
for(chain = vdso_info->bucket[sym_keys[i].sym_hash % vdso_info->nbucket];
|
||||||
chain != 0; chain = vdso_info->chain[chain]) {
|
chain != 0; chain = vdso_info->chain[chain]) {
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue