go: Always pass interpreter to linker

Message ID 20220411123520.95107-1-lkml@jv-coder.de
State Accepted, archived
Commit 6b54215074d7f3dbba07f096f16b9c0acf51527c
Headers show
Series go: Always pass interpreter to linker | expand

Commit Message

Joerg Vehlow April 11, 2022, 12:35 p.m. UTC
From: Joerg Vehlow <joerg.vehlow@aox.de>

When gos internal linker is used, it uses hardcoded paths to the
interpreter (dynamic linker). For x86_64 this hardcoded path is
/lib64/ld-linux-x86-64.so.2, but yocto's default dynamic linker path
is /lib64/ld-linux-x86-64.so.2.
Most of the time, the internal linker is not used and binutils linker
sets the correct path, but sometimes the internal linker is used and
the resulting binary will not work on x86_64.

To ensure the path is always correct, pass  it to the linker.

Signed-off-by: Joerg Vehlow <joerg.vehlow@aox.de>
---
 meta/classes/go.bbclass | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Jose Quaresma April 11, 2022, 1:30 p.m. UTC | #1
J?rg Vehlow <lkml@jv-coder.de> escreveu no dia segunda, 11/04/2022 à(s)
13:35:

> From: Joerg Vehlow <joerg.vehlow@aox.de>
>
> When gos internal linker is used, it uses hardcoded paths to the
> interpreter (dynamic linker). For x86_64 this hardcoded path is
> /lib64/ld-linux-x86-64.so.2, but yocto's default dynamic linker path
> is /lib64/ld-linux-x86-64.so.2.
>

Is this correct? The first path is the seme one of the second.

Jose


> Most of the time, the internal linker is not used and binutils linker
> sets the correct path, but sometimes the internal linker is used and
> the resulting binary will not work on x86_64.
>
> To ensure the path is always correct, pass  it to the linker.
>
> Signed-off-by: Joerg Vehlow <joerg.vehlow@aox.de>
> ---
>  meta/classes/go.bbclass | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/meta/classes/go.bbclass b/meta/classes/go.bbclass
> index 9c4c92bffd..df8d4db26d 100644
> --- a/meta/classes/go.bbclass
> +++ b/meta/classes/go.bbclass
> @@ -1,4 +1,5 @@
>  inherit goarch
> +inherit linuxloader
>
>  GO_PARALLEL_BUILD ?= "${@oe.utils.parallel_make_argument(d, '-p %d')}"
>
> @@ -44,7 +45,7 @@ GO_LINKMODE ?= ""
>  GO_LINKMODE:class-nativesdk = "--linkmode=external"
>  GO_LINKMODE:class-native = "--linkmode=external"
>  GO_EXTRA_LDFLAGS ?= ""
> -GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} ${GO_EXTRA_LDFLAGS}
> -extldflags '${GO_EXTLDFLAGS}'"'
> +GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} -I
> ${@get_linuxloader(d)} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'
>  export GOBUILDFLAGS ?= "-v ${GO_LDFLAGS} -trimpath"
>  export GOPATH_OMIT_IN_ACTIONID ?= "1"
>  export GOPTESTBUILDFLAGS ?= "${GOBUILDFLAGS} -c"
> --
> 2.25.1
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#164219):
> https://lists.openembedded.org/g/openembedded-core/message/164219
> Mute This Topic: https://lists.openembedded.org/mt/90393660/5052612
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> quaresma.jose@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
Joerg Vehlow April 11, 2022, 1:32 p.m. UTC | #2
Hi Jose,

Am 4/11/2022 um 3:30 PM schrieb Jose Quaresma:
> 
> 
> J?rg Vehlow <lkml@jv-coder.de <mailto:lkml@jv-coder.de>> escreveu no dia
> segunda, 11/04/2022 à(s) 13:35:
> 
>     From: Joerg Vehlow <joerg.vehlow@aox.de <mailto:joerg.vehlow@aox.de>>
> 
>     When gos internal linker is used, it uses hardcoded paths to the
>     interpreter (dynamic linker). For x86_64 this hardcoded path is
>     /lib64/ld-linux-x86-64.so.2, but yocto's default dynamic linker path
>     is /lib64/ld-linux-x86-64.so.2.
> 
> 
> Is this correct? The first path is the seme one of the second.
Yes... of course this is wrong. /lib/ld-linux-x86-64.so.2 is the default
linker path for yocto on x86_64

Sorry about that

Joerg
Khem Raj April 11, 2022, 4:04 p.m. UTC | #3
On Mon, Apr 11, 2022 at 6:30 AM Jose Quaresma <quaresma.jose@gmail.com> wrote:
>
>
>
> J?rg Vehlow <lkml@jv-coder.de> escreveu no dia segunda, 11/04/2022 à(s) 13:35:
>>
>> From: Joerg Vehlow <joerg.vehlow@aox.de>
>>
>> When gos internal linker is used, it uses hardcoded paths to the
>> interpreter (dynamic linker). For x86_64 this hardcoded path is
>> /lib64/ld-linux-x86-64.so.2, but yocto's default dynamic linker path
>> is /lib64/ld-linux-x86-64.so.2.
>
>
> Is this correct? The first path is the seme one of the second.

its a typo, Sadly we do differ in baselib naming convention on x86_64
( without multilib )
compared to other distributions which are inherently multilib and use
/lib64 OE instead uses
/lib when multilib is not enabled but lib64/ when multilib is enabled.

>
> Jose
>
>>
>> Most of the time, the internal linker is not used and binutils linker
>> sets the correct path, but sometimes the internal linker is used and
>> the resulting binary will not work on x86_64.
>>
>> To ensure the path is always correct, pass  it to the linker.
>>
>> Signed-off-by: Joerg Vehlow <joerg.vehlow@aox.de>
>> ---
>>  meta/classes/go.bbclass | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/meta/classes/go.bbclass b/meta/classes/go.bbclass
>> index 9c4c92bffd..df8d4db26d 100644
>> --- a/meta/classes/go.bbclass
>> +++ b/meta/classes/go.bbclass
>> @@ -1,4 +1,5 @@
>>  inherit goarch
>> +inherit linuxloader
>>
>>  GO_PARALLEL_BUILD ?= "${@oe.utils.parallel_make_argument(d, '-p %d')}"
>>
>> @@ -44,7 +45,7 @@ GO_LINKMODE ?= ""
>>  GO_LINKMODE:class-nativesdk = "--linkmode=external"
>>  GO_LINKMODE:class-native = "--linkmode=external"
>>  GO_EXTRA_LDFLAGS ?= ""
>> -GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'
>> +GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} -I ${@get_linuxloader(d)} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'
>>  export GOBUILDFLAGS ?= "-v ${GO_LDFLAGS} -trimpath"
>>  export GOPATH_OMIT_IN_ACTIONID ?= "1"
>>  export GOPTESTBUILDFLAGS ?= "${GOBUILDFLAGS} -c"
>> --
>> 2.25.1
>>
>>
>> -=-=-=-=-=-=-=-=-=-=-=-
>> Links: You receive all messages sent to this group.
>> View/Reply Online (#164219): https://lists.openembedded.org/g/openembedded-core/message/164219
>> Mute This Topic: https://lists.openembedded.org/mt/90393660/5052612
>> Group Owner: openembedded-core+owner@lists.openembedded.org
>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [quaresma.jose@gmail.com]
>> -=-=-=-=-=-=-=-=-=-=-=-
>>
>
>
> --
> Best regards,
>
> José Quaresma
Joerg Vehlow April 14, 2022, 5:24 a.m. UTC | #4
Hi,

Am 4/11/2022 um 6:04 PM schrieb Khem Raj:
> On Mon, Apr 11, 2022 at 6:30 AM Jose Quaresma <quaresma.jose@gmail.com> wrote:
>>
>>
>>
>> J?rg Vehlow <lkml@jv-coder.de> escreveu no dia segunda, 11/04/2022 à(s) 13:35:
>>>
>>> From: Joerg Vehlow <joerg.vehlow@aox.de>
>>>
>>> When gos internal linker is used, it uses hardcoded paths to the
>>> interpreter (dynamic linker). For x86_64 this hardcoded path is
>>> /lib64/ld-linux-x86-64.so.2, but yocto's default dynamic linker path
>>> is /lib64/ld-linux-x86-64.so.2.
>>
>>
>> Is this correct? The first path is the seme one of the second.
> 
> its a typo, Sadly we do differ in baselib naming convention on x86_64
> ( without multilib )
> compared to other distributions which are inherently multilib and use
> /lib64 OE instead uses
> /lib when multilib is not enabled but lib64/ when multilib is enabled.

Any comment on the content of the patch or do I have to send a v2 with a
fixed commit message?

Thanks,
Joerg
Richard Purdie April 29, 2022, 12:45 p.m. UTC | #5
On Thu, 2022-04-14 at 07:24 +0200, J?rg Vehlow wrote:
> Hi,
> 
> Am 4/11/2022 um 6:04 PM schrieb Khem Raj:
> > On Mon, Apr 11, 2022 at 6:30 AM Jose Quaresma <quaresma.jose@gmail.com> wrote:
> > > 
> > > 
> > > 
> > > J?rg Vehlow <lkml@jv-coder.de> escreveu no dia segunda, 11/04/2022 à(s) 13:35:
> > > > 
> > > > From: Joerg Vehlow <joerg.vehlow@aox.de>
> > > > 
> > > > When gos internal linker is used, it uses hardcoded paths to the
> > > > interpreter (dynamic linker). For x86_64 this hardcoded path is
> > > > /lib64/ld-linux-x86-64.so.2, but yocto's default dynamic linker path
> > > > is /lib64/ld-linux-x86-64.so.2.
> > > 
> > > 
> > > Is this correct? The first path is the seme one of the second.
> > 
> > its a typo, Sadly we do differ in baselib naming convention on x86_64
> > ( without multilib )
> > compared to other distributions which are inherently multilib and use
> > /lib64 OE instead uses
> > /lib when multilib is not enabled but lib64/ when multilib is enabled.
> 
> Any comment on the content of the patch or do I have to send a v2 with a
> fixed commit message?

It merged:

https://git.yoctoproject.org/poky/commit/?id=460012e04a89e0b84fd5949c9a2229ef46e7a341

Cheers,

Richard

Patch

diff --git a/meta/classes/go.bbclass b/meta/classes/go.bbclass
index 9c4c92bffd..df8d4db26d 100644
--- a/meta/classes/go.bbclass
+++ b/meta/classes/go.bbclass
@@ -1,4 +1,5 @@ 
 inherit goarch
+inherit linuxloader
 
 GO_PARALLEL_BUILD ?= "${@oe.utils.parallel_make_argument(d, '-p %d')}"
 
@@ -44,7 +45,7 @@  GO_LINKMODE ?= ""
 GO_LINKMODE:class-nativesdk = "--linkmode=external"
 GO_LINKMODE:class-native = "--linkmode=external"
 GO_EXTRA_LDFLAGS ?= ""
-GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'
+GO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} -I ${@get_linuxloader(d)} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"'
 export GOBUILDFLAGS ?= "-v ${GO_LDFLAGS} -trimpath"
 export GOPATH_OMIT_IN_ACTIONID ?= "1"
 export GOPTESTBUILDFLAGS ?= "${GOBUILDFLAGS} -c"