[v2] go.bbclass: fix path to linker in native Go builds

Message ID 20220525175627.829194-1-dmitry.baryshkov@linaro.org
State Accepted, archived
Commit 44b397daa68b4d0a461225fe9ff7db8b5fcfdb7b
Headers show
Series [v2] go.bbclass: fix path to linker in native Go builds | expand

Commit Message

Dmitry Baryshkov May 25, 2022, 5:56 p.m. UTC
Building native Go tools results in the tool pointing to the wrong
location of dynamic linker (see below). The linker is looked up in the
temporary dir, which can be removed if rm_work is inherited. This
results in being unable to execute the program with the 'No such file or
directory' error. Override linker specificiation for native recipes (and
let Go build environment to pick up a correct one on it's own).

Without this patch:

$ ldd tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man
	linux-vdso.so.1 (0x00007ffe945ec000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3a7490e000)
	/home/lumag/Projects/RPB/build-rpb/tmp-rpb-glibc/work/x86_64-linux/go-md2man-native/1.0.10+gitAUTOINC+f79a8a8ca6-r0/recipe-sysroot-native/usr/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f3a74d13000)
$ tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man  --help
-bash: tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man: No such file or directory

With the patch

$ ldd tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man
	linux-vdso.so.1 (0x00007ffd19dbf000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d44181000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f2d44586000)
$ tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man  --help
Usage of tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man:
  -in string
	Path to file to be processed (default: stdin)
  -out string
	Path to output processed file (default: stdout)

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
Changes since v1:
 - Explicitly use UNINATIVE_LOADER if uninative is enabled. This is not
   required (as the binaries will be patches anyway), but makes things
   more obvious.
---
 meta/classes/go.bbclass | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Richard Purdie May 25, 2022, 6:58 p.m. UTC | #1
On Wed, 2022-05-25 at 20:56 +0300, Dmitry Baryshkov wrote:
> Building native Go tools results in the tool pointing to the wrong
> location of dynamic linker (see below). The linker is looked up in the
> temporary dir, which can be removed if rm_work is inherited. This
> results in being unable to execute the program with the 'No such file or
> directory' error. Override linker specificiation for native recipes (and
> let Go build environment to pick up a correct one on it's own).
> 
> Without this patch:
> 
> $ ldd tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man
> 	linux-vdso.so.1 (0x00007ffe945ec000)
> 	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3a7490e000)
> 	/home/lumag/Projects/RPB/build-rpb/tmp-rpb-glibc/work/x86_64-linux/go-md2man-native/1.0.10+gitAUTOINC+f79a8a8ca6-r0/recipe-sysroot-native/usr/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f3a74d13000)
> $ tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man  --help
> -bash: tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man: No such file or directory
> 
> With the patch
> 
> $ ldd tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man
> 	linux-vdso.so.1 (0x00007ffd19dbf000)
> 	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d44181000)
> 	/lib64/ld-linux-x86-64.so.2 (0x00007f2d44586000)
> $ tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man  --help
> Usage of tmp-rpb-glibc/sysroots-components/x86_64/go-md2man-native/usr/bin/go-md2man:
>   -in string
> 	Path to file to be processed (default: stdin)
>   -out string
> 	Path to output processed file (default: stdout)
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> Changes since v1:
>  - Explicitly use UNINATIVE_LOADER if uninative is enabled. This is not
>    required (as the binaries will be patches anyway), but makes things
>    more obvious.
> ---
>  meta/classes/go.bbclass | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/meta/classes/go.bbclass b/meta/classes/go.bbclass
> index 1a9a0bc1d426..da3cab5da5bf 100644
> --- a/meta/classes/go.bbclass
> +++ b/meta/classes/go.bbclass
> @@ -45,7 +45,9 @@ GO_LINKMODE ?= ""
>  GO_LINKMODE:class-nativesdk = "--linkmode=external"
>  GO_LINKMODE:class-native = "--linkmode=external"
>  GO_EXTRA_LDFLAGS ?= ""
> -GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} -I ${@get_linuxloader(d)} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'
> +GO_LINUXLOADER ?= "-I ${@get_linuxloader(d)}"
> +GO_LINUXLOADER:class-native = "${@ "-I " + d.getVar('UNINATIVE_LOADER') if bb.data.inherits_class('uninative', d) else '' }"
> +GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} ${GO_LINUXLOADER} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'

This will result in taskhash changes between uninative and non-
uninative builds and I suspect will trip up some of the selftests as a
result.

I think your original patch is ok, we just need to mention it is for
the non-uninative case in the commit message as that explains why
people haven't seen some of the issues. That did confuse me initially!

Cheers,

Richard

Patch

diff --git a/meta/classes/go.bbclass b/meta/classes/go.bbclass
index 1a9a0bc1d426..da3cab5da5bf 100644
--- a/meta/classes/go.bbclass
+++ b/meta/classes/go.bbclass
@@ -45,7 +45,9 @@  GO_LINKMODE ?= ""
 GO_LINKMODE:class-nativesdk = "--linkmode=external"
 GO_LINKMODE:class-native = "--linkmode=external"
 GO_EXTRA_LDFLAGS ?= ""
-GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} -I ${@get_linuxloader(d)} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'
+GO_LINUXLOADER ?= "-I ${@get_linuxloader(d)}"
+GO_LINUXLOADER:class-native = "${@ "-I " + d.getVar('UNINATIVE_LOADER') if bb.data.inherits_class('uninative', d) else '' }"
+GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} ${GO_LINUXLOADER} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'
 export GOBUILDFLAGS ?= "-v ${GO_LDFLAGS} -trimpath"
 export GOPATH_OMIT_IN_ACTIONID ?= "1"
 export GOPTESTBUILDFLAGS ?= "${GOBUILDFLAGS} -c"