diff --git a/misc/cgo/testcshared/test.bash b/misc/cgo/testcshared/test.bash index 4ff4db446c..315a0d4036 100755 --- a/misc/cgo/testcshared/test.bash +++ b/misc/cgo/testcshared/test.bash @@ -179,6 +179,13 @@ if test "$output" != "PASS"; then status=1 fi +if test "$libext" = "dylib"; then + # make sure dylibs are well-formed + if ! otool -l libgo*.dylib >/dev/null; then + status=1 + fi +fi + if test $status = 0; then echo "ok" fi diff --git a/src/cmd/link/internal/ld/macho_combine_dwarf.go b/src/cmd/link/internal/ld/macho_combine_dwarf.go index dcc371ec05..8c6c4a86ac 100644 --- a/src/cmd/link/internal/ld/macho_combine_dwarf.go +++ b/src/cmd/link/internal/ld/macho_combine_dwarf.go @@ -17,6 +17,7 @@ import ( var realdwarf, linkseg *macho.Segment var dwarfstart, linkstart int64 +var dwarfaddr, linkaddr int64 var linkoffset uint32 const ( @@ -41,8 +42,7 @@ const ( LC_DYLIB_CODE_SIGN_DRS = 0x2B LC_ENCRYPTION_INFO_64 = 0x2C - dwarfMinAlign = 6 // 64 = 1 << 6 - pageAlign = 12 // 4096 = 1 << 12 + pageAlign = 12 // 4096 = 1 << 12 ) type loadCmd struct { @@ -157,16 +157,13 @@ func machoCombineDwarf(inexe, dsym, outexe string) error { } // Now copy the dwarf data into the output. - maxalign := uint32(dwarfMinAlign) // - for _, sect := range dwarfm.Sections { - if sect.Align > maxalign { - maxalign = sect.Align - } - } - dwarfstart = machoCalcStart(realdwarf.Offset, linkseg.Offset, maxalign) + // Kernel requires all loaded segments to be page-aligned in the file, + // even though we mark this one as being 0 bytes of virtual address space. + dwarfstart = machoCalcStart(realdwarf.Offset, linkseg.Offset, pageAlign) if _, err = outf.Seek(dwarfstart, 0); err != nil { return err } + dwarfaddr = int64((linkseg.Addr + linkseg.Memsz + 1<