linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] x86_64: Add "-m elf_i386" when linking i386 object files.
       [not found] <CAKwvOdnr1=Q=mL-P2icMTP8do3CVH+KF8564fKmpK_OshKxKwg@mail.gmail.com>
@ 2019-01-11 19:14 ` Tri Vo
  2019-01-11 19:27   ` Nick Desaulniers
  0 siblings, 1 reply; 5+ messages in thread
From: Tri Vo @ 2019-01-11 19:14 UTC (permalink / raw)
  To: x86, tglx, mingo, bp, hpa
  Cc: grimar, dima, morbo, ndesaulniers, matz, ruiu, linux-kernel, Tri Vo

From: George Rimar <grimar@accesssoftek.com>

Linux kernel uses OUTPUT_FORMAT in it's linker scripts. Most of the time
-m option is passed to the linker with correct architecture, but
sometimes (at least for x86_64) the -m option contradicts OUTPUT_FORMAT
directive. Specifically, arch/x86/boot and arch/x86/realmode/rm modules
have i386 object files, but are linked with -m elf_x86_64 linker flag
when building for x86_64.

"man ld" doesn't explicitly state any tie-breakers between -m and
OUTPUT_FORMAT. BFD and Gold linkers override -m value with
OUTPUT_FORMAT. But LLVM lld has a different behavior. When supplied with
contradicting -m and OUTPUT_FORMAT values it fails with the following
error message:

  ld.lld: error: arch/x86/realmode/rm/header.o is incompatible with elf_x86_64

Suggested fix: just add correct -m after incorrect one (it overrides
it), so the linker invocation looks like this: ld -m elf_x86_64 -z
max-page-size=0x200000 -m elf_i386 --emit-relocs -T realmode.lds
header.o trampoline_64.o stack.o reboot.o -o realmode.elf

This is not a functional change for GNU ld, because (although not
explicitly documented) it already overrides -m EMULATION with
OUTPUT_FORMAT.

Tested by building x86_64 kernel with GNU gcc/ld toolchain and booting
it in QEMU.

Suggested-by: Dmitry Golovin <dima@golovin.in>
Signed-off-by: Georgii Rymar <grimar@accesssoftek.com>
Signed-off-by: Tri Vo <trong@android.com>
Tested-by: Tri Vo <trong@android.com>
---
 arch/x86/boot/Makefile        | 2 +-
 arch/x86/realmode/rm/Makefile | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
index 9b5adae9cc40..e2839b5c246c 100644
--- a/arch/x86/boot/Makefile
+++ b/arch/x86/boot/Makefile
@@ -100,7 +100,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE
 AFLAGS_header.o += -I$(objtree)/$(obj)
 $(obj)/header.o: $(obj)/zoffset.h
 
-LDFLAGS_setup.elf	:= -T
+LDFLAGS_setup.elf	:= -m elf_i386 -T
 $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
 	$(call if_changed,ld)
 
diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
index 4463fa72db94..96cb20de08af 100644
--- a/arch/x86/realmode/rm/Makefile
+++ b/arch/x86/realmode/rm/Makefile
@@ -47,7 +47,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
 targets += realmode.lds
 $(obj)/realmode.lds: $(obj)/pasyms.h
 
-LDFLAGS_realmode.elf := --emit-relocs -T
+LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T
 CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj)
 
 targets += realmode.elf
-- 
2.20.1.97.g81188d93c3-goog


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] x86_64: Add "-m elf_i386" when linking i386 object files.
  2019-01-11 19:14 ` [PATCH v2] x86_64: Add "-m elf_i386" when linking i386 object files Tri Vo
@ 2019-01-11 19:27   ` Nick Desaulniers
  2019-01-11 20:10     ` [PATCH v3] " Tri Vo
  0 siblings, 1 reply; 5+ messages in thread
From: Nick Desaulniers @ 2019-01-11 19:27 UTC (permalink / raw)
  To: Tri Vo
  Cc: x86, Thomas Gleixner, mingo, Borislav Petkov, hpa, George Rimar,
	Dmitry Golovin, Bill Wendling, Michael Matz, Rui Ueyama, LKML

On Fri, Jan 11, 2019 at 11:14 AM Tri Vo <trong@android.com> wrote:
>
> From: George Rimar <grimar@accesssoftek.com>
>
> Linux kernel uses OUTPUT_FORMAT in it's linker scripts. Most of the time
> -m option is passed to the linker with correct architecture, but
> sometimes (at least for x86_64) the -m option contradicts OUTPUT_FORMAT
> directive. Specifically, arch/x86/boot and arch/x86/realmode/rm modules
> have i386 object files, but are linked with -m elf_x86_64 linker flag
> when building for x86_64.
>
> "man ld" doesn't explicitly state any tie-breakers between -m and
> OUTPUT_FORMAT. BFD and Gold linkers override -m value with
> OUTPUT_FORMAT. But LLVM lld has a different behavior. When supplied with
> contradicting -m and OUTPUT_FORMAT values it fails with the following
> error message:
>
>   ld.lld: error: arch/x86/realmode/rm/header.o is incompatible with elf_x86_64
>
> Suggested fix: just add correct -m after incorrect one (it overrides
> it), so the linker invocation looks like this: ld -m elf_x86_64 -z
> max-page-size=0x200000 -m elf_i386 --emit-relocs -T realmode.lds
> header.o trampoline_64.o stack.o reboot.o -o realmode.elf
>
> This is not a functional change for GNU ld, because (although not
> explicitly documented) it already overrides -m EMULATION with
> OUTPUT_FORMAT.
>
> Tested by building x86_64 kernel with GNU gcc/ld toolchain and booting
> it in QEMU.
>
> Suggested-by: Dmitry Golovin <dima@golovin.in>
> Signed-off-by: Georgii Rymar <grimar@accesssoftek.com>

misspelled, and you may carry forward my tested by tag from v1.

> Signed-off-by: Tri Vo <trong@android.com>
> Tested-by: Tri Vo <trong@android.com>
> ---

So when making a change, you can put any text below this `---`
delimiter.  For LKML, it's common practice to put something like:
v1 -> v2: updated commit message
That helps code review so reviewers know what to expect "inter-diff"
when eyeballing patch files.  Internally when using gerrit, it will
highlight inter-version diffs (ie. what changed between v2 and v3 of a
patch), but since we do things the hard way on LKML, this can help a
lot.  After `git format-patch ...`, I usually add such a comment to
the patch file in vim before sending.

>  arch/x86/boot/Makefile        | 2 +-
>  arch/x86/realmode/rm/Makefile | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
> index 9b5adae9cc40..e2839b5c246c 100644
> --- a/arch/x86/boot/Makefile
> +++ b/arch/x86/boot/Makefile
> @@ -100,7 +100,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE
>  AFLAGS_header.o += -I$(objtree)/$(obj)
>  $(obj)/header.o: $(obj)/zoffset.h
>
> -LDFLAGS_setup.elf      := -T
> +LDFLAGS_setup.elf      := -m elf_i386 -T
>  $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
>         $(call if_changed,ld)
>
> diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
> index 4463fa72db94..96cb20de08af 100644
> --- a/arch/x86/realmode/rm/Makefile
> +++ b/arch/x86/realmode/rm/Makefile
> @@ -47,7 +47,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
>  targets += realmode.lds
>  $(obj)/realmode.lds: $(obj)/pasyms.h
>
> -LDFLAGS_realmode.elf := --emit-relocs -T
> +LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T
>  CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj)
>
>  targets += realmode.elf
> --
> 2.20.1.97.g81188d93c3-goog
>


-- 
Thanks,
~Nick Desaulniers

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3] x86_64: Add "-m elf_i386" when linking i386 object files.
  2019-01-11 19:27   ` Nick Desaulniers
@ 2019-01-11 20:10     ` Tri Vo
  2019-01-12  8:39       ` [tip:x86/build] x86/build: Specify elf_i386 linker emulation explicitly for i386 objects tip-bot for George Rimar
  2019-01-12 10:00       ` [PATCH v3] x86_64: Add "-m elf_i386" when linking i386 object files George Rimar
  0 siblings, 2 replies; 5+ messages in thread
From: Tri Vo @ 2019-01-11 20:10 UTC (permalink / raw)
  To: x86, tglx, mingo, bp, hpa
  Cc: grimar, dima, morbo, ndesaulniers, matz, ruiu, linux-kernel, Tri Vo

From: George Rimar <grimar@accesssoftek.com>

Linux kernel uses OUTPUT_FORMAT in it's linker scripts. Most of the time
-m option is passed to the linker with correct architecture, but
sometimes (at least for x86_64) the -m option contradicts OUTPUT_FORMAT
directive. Specifically, arch/x86/boot and arch/x86/realmode/rm modules
have i386 object files, but are linked with -m elf_x86_64 linker flag
when building for x86_64.

"man ld" doesn't explicitly state any tie-breakers between -m and
OUTPUT_FORMAT. BFD and Gold linkers override -m value with
OUTPUT_FORMAT. But LLVM lld has a different behavior. When supplied with
contradicting -m and OUTPUT_FORMAT values it fails with the following
error message:

  ld.lld: error: arch/x86/realmode/rm/header.o is incompatible with elf_x86_64

Suggested fix: just add correct -m after incorrect one (it overrides
it), so the linker invocation looks like this: ld -m elf_x86_64 -z
max-page-size=0x200000 -m elf_i386 --emit-relocs -T realmode.lds
header.o trampoline_64.o stack.o reboot.o -o realmode.elf

This is not a functional change for GNU ld, because (although not
explicitly documented) it already overrides -m EMULATION with
OUTPUT_FORMAT.

Tested by building x86_64 kernel with GNU gcc/ld toolchain and booting
it in QEMU.

Suggested-by: Dmitry Golovin <dima@golovin.in>
Signed-off-by: George Rimar <grimar@accesssoftek.com>
Signed-off-by: Tri Vo <trong@android.com>
Tested-by: Tri Vo <trong@android.com>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
---
v2: updated commit message to clarify that ld documentation is ambiguous w.r.t
    -m vs OUTPUT_FORMAT behavior.
v3: fixed/added SOB and "Tested-by" fields.

 arch/x86/boot/Makefile        | 2 +-
 arch/x86/realmode/rm/Makefile | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
index 9b5adae9cc40..e2839b5c246c 100644
--- a/arch/x86/boot/Makefile
+++ b/arch/x86/boot/Makefile
@@ -100,7 +100,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE
 AFLAGS_header.o += -I$(objtree)/$(obj)
 $(obj)/header.o: $(obj)/zoffset.h

-LDFLAGS_setup.elf	:= -T
+LDFLAGS_setup.elf	:= -m elf_i386 -T
 $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
 	$(call if_changed,ld)

diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
index 4463fa72db94..96cb20de08af 100644
--- a/arch/x86/realmode/rm/Makefile
+++ b/arch/x86/realmode/rm/Makefile
@@ -47,7 +47,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
 targets += realmode.lds
 $(obj)/realmode.lds: $(obj)/pasyms.h

-LDFLAGS_realmode.elf := --emit-relocs -T
+LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T
 CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj)

 targets += realmode.elf
--
2.20.1.97.g81188d93c3-goog


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [tip:x86/build] x86/build: Specify elf_i386 linker emulation explicitly for i386 objects
  2019-01-11 20:10     ` [PATCH v3] " Tri Vo
@ 2019-01-12  8:39       ` tip-bot for George Rimar
  2019-01-12 10:00       ` [PATCH v3] x86_64: Add "-m elf_i386" when linking i386 object files George Rimar
  1 sibling, 0 replies; 5+ messages in thread
From: tip-bot for George Rimar @ 2019-01-12  8:39 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, mingo, hpa, bp, trong, tglx, ndesaulniers, mingo,
	grimar, matz, x86, dima

Commit-ID:  927185c124d62a9a4d35878d7f6d432a166b74e3
Gitweb:     https://git.kernel.org/tip/927185c124d62a9a4d35878d7f6d432a166b74e3
Author:     George Rimar <grimar@accesssoftek.com>
AuthorDate: Fri, 11 Jan 2019 12:10:12 -0800
Committer:  Borislav Petkov <bp@suse.de>
CommitDate: Sat, 12 Jan 2019 00:11:39 +0100

x86/build: Specify elf_i386 linker emulation explicitly for i386 objects

The kernel uses the OUTPUT_FORMAT linker script command in it's linker
scripts. Most of the time, the -m option is passed to the linker with
correct architecture, but sometimes (at least for x86_64) the -m option
contradicts the OUTPUT_FORMAT directive.

Specifically, arch/x86/boot and arch/x86/realmode/rm produce i386 object
files, but are linked with the -m elf_x86_64 linker flag when building
for x86_64.

The GNU linker manpage doesn't explicitly state any tie-breakers between
-m and OUTPUT_FORMAT. But with BFD and Gold linkers, OUTPUT_FORMAT
overrides the emulation value specified with the -m option.

LLVM lld has a different behavior, however. When supplied with
contradicting -m and OUTPUT_FORMAT values it fails with the following
error message:

  ld.lld: error: arch/x86/realmode/rm/header.o is incompatible with elf_x86_64

Therefore, just add the correct -m after the incorrect one (it overrides
it), so the linker invocation looks like this:

  ld -m elf_x86_64 -z max-page-size=0x200000 -m elf_i386 --emit-relocs -T \
    realmode.lds header.o trampoline_64.o stack.o reboot.o -o realmode.elf

This is not a functional change for GNU ld, because (although not
explicitly documented) OUTPUT_FORMAT overrides -m EMULATION.

Tested by building x86_64 kernel with GNU gcc/ld toolchain and booting
it in QEMU.

 [ bp: massage and clarify text. ]

Suggested-by: Dmitry Golovin <dima@golovin.in>
Signed-off-by: George Rimar <grimar@accesssoftek.com>
Signed-off-by: Tri Vo <trong@android.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Tested-by: Tri Vo <trong@android.com>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Michael Matz <matz@suse.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: morbo@google.com
Cc: ndesaulniers@google.com
Cc: ruiu@google.com
Cc: x86-ml <x86@kernel.org>
Link: https://lkml.kernel.org/r/20190111201012.71210-1-trong@android.com
---
 arch/x86/boot/Makefile        | 2 +-
 arch/x86/realmode/rm/Makefile | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
index 9b5adae9cc40..e2839b5c246c 100644
--- a/arch/x86/boot/Makefile
+++ b/arch/x86/boot/Makefile
@@ -100,7 +100,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE
 AFLAGS_header.o += -I$(objtree)/$(obj)
 $(obj)/header.o: $(obj)/zoffset.h
 
-LDFLAGS_setup.elf	:= -T
+LDFLAGS_setup.elf	:= -m elf_i386 -T
 $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
 	$(call if_changed,ld)
 
diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
index 4463fa72db94..96cb20de08af 100644
--- a/arch/x86/realmode/rm/Makefile
+++ b/arch/x86/realmode/rm/Makefile
@@ -47,7 +47,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
 targets += realmode.lds
 $(obj)/realmode.lds: $(obj)/pasyms.h
 
-LDFLAGS_realmode.elf := --emit-relocs -T
+LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T
 CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj)
 
 targets += realmode.elf

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] x86_64: Add "-m elf_i386" when linking i386 object files.
  2019-01-11 20:10     ` [PATCH v3] " Tri Vo
  2019-01-12  8:39       ` [tip:x86/build] x86/build: Specify elf_i386 linker emulation explicitly for i386 objects tip-bot for George Rimar
@ 2019-01-12 10:00       ` George Rimar
  1 sibling, 0 replies; 5+ messages in thread
From: George Rimar @ 2019-01-12 10:00 UTC (permalink / raw)
  To: Tri Vo, x86, tglx, mingo, bp, hpa
  Cc: dima, morbo, ndesaulniers, matz, ruiu, linux-kernel

Signed-off-by: George Rimar <grimar@accesssoftek.com>

Best regards,
George | Developer | Access Softek, Inc

________________________________________
От: Tri Vo <trong@android.com>
Отправлено: 11 января 2019 г. 23:10
Кому: x86@kernel.org; tglx@linutronix.de; mingo@redhat.com; bp@alien8.de; hpa@zytor.com
Копия: George Rimar; dima@golovin.in; morbo@google.com; ndesaulniers@google.com; matz@suse.de; ruiu@google.com; linux-kernel@vger.kernel.org; Tri Vo
Тема: [PATCH v3] x86_64: Add "-m elf_i386" when linking i386 object files.

CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.  If you suspect potential phishing or spam email, report it to ReportSpam@accesssoftek.com

From: George Rimar <grimar@accesssoftek.com>

Linux kernel uses OUTPUT_FORMAT in it's linker scripts. Most of the time
-m option is passed to the linker with correct architecture, but
sometimes (at least for x86_64) the -m option contradicts OUTPUT_FORMAT
directive. Specifically, arch/x86/boot and arch/x86/realmode/rm modules
have i386 object files, but are linked with -m elf_x86_64 linker flag
when building for x86_64.

"man ld" doesn't explicitly state any tie-breakers between -m and
OUTPUT_FORMAT. BFD and Gold linkers override -m value with
OUTPUT_FORMAT. But LLVM lld has a different behavior. When supplied with
contradicting -m and OUTPUT_FORMAT values it fails with the following
error message:

  ld.lld: error: arch/x86/realmode/rm/header.o is incompatible with elf_x86_64

Suggested fix: just add correct -m after incorrect one (it overrides
it), so the linker invocation looks like this: ld -m elf_x86_64 -z
max-page-size=0x200000 -m elf_i386 --emit-relocs -T realmode.lds
header.o trampoline_64.o stack.o reboot.o -o realmode.elf

This is not a functional change for GNU ld, because (although not
explicitly documented) it already overrides -m EMULATION with
OUTPUT_FORMAT.

Tested by building x86_64 kernel with GNU gcc/ld toolchain and booting
it in QEMU.

Suggested-by: Dmitry Golovin <dima@golovin.in>
Signed-off-by: George Rimar <grimar@accesssoftek.com>
Signed-off-by: Tri Vo <trong@android.com>
Tested-by: Tri Vo <trong@android.com>
Tested-by: Nick Desaulniers <ndesaulniers@google.com>
---
v2: updated commit message to clarify that ld documentation is ambiguous w.r.t
    -m vs OUTPUT_FORMAT behavior.
v3: fixed/added SOB and "Tested-by" fields.

 arch/x86/boot/Makefile        | 2 +-
 arch/x86/realmode/rm/Makefile | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
index 9b5adae9cc40..e2839b5c246c 100644
--- a/arch/x86/boot/Makefile
+++ b/arch/x86/boot/Makefile
@@ -100,7 +100,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE
 AFLAGS_header.o += -I$(objtree)/$(obj)
 $(obj)/header.o: $(obj)/zoffset.h

-LDFLAGS_setup.elf      := -T
+LDFLAGS_setup.elf      := -m elf_i386 -T
 $(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
        $(call if_changed,ld)

diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
index 4463fa72db94..96cb20de08af 100644
--- a/arch/x86/realmode/rm/Makefile
+++ b/arch/x86/realmode/rm/Makefile
@@ -47,7 +47,7 @@ $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
 targets += realmode.lds
 $(obj)/realmode.lds: $(obj)/pasyms.h

-LDFLAGS_realmode.elf := --emit-relocs -T
+LDFLAGS_realmode.elf := -m elf_i386 --emit-relocs -T
 CPPFLAGS_realmode.lds += -P -C -I$(objtree)/$(obj)

 targets += realmode.elf
--
2.20.1.97.g81188d93c3-goog


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-01-12 10:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CAKwvOdnr1=Q=mL-P2icMTP8do3CVH+KF8564fKmpK_OshKxKwg@mail.gmail.com>
2019-01-11 19:14 ` [PATCH v2] x86_64: Add "-m elf_i386" when linking i386 object files Tri Vo
2019-01-11 19:27   ` Nick Desaulniers
2019-01-11 20:10     ` [PATCH v3] " Tri Vo
2019-01-12  8:39       ` [tip:x86/build] x86/build: Specify elf_i386 linker emulation explicitly for i386 objects tip-bot for George Rimar
2019-01-12 10:00       ` [PATCH v3] x86_64: Add "-m elf_i386" when linking i386 object files George Rimar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).