Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

After r307100, segfaults when linking FreeBSD aarch64 kernel #33168

Closed
DimitryAndric opened this issue Jul 17, 2017 · 5 comments
Closed

After r307100, segfaults when linking FreeBSD aarch64 kernel #33168

DimitryAndric opened this issue Jul 17, 2017 · 5 comments
Labels
bugzilla Issues migrated from bugzilla lld:ELF

Comments

@DimitryAndric
Copy link
Collaborator

Bugzilla Link 33821
Resolution FIXED
Resolved on Jul 18, 2017 16:16
Version unspecified
OS All
Blocks #23588
CC @emaste

Extended Description

As reported on https://reviews.llvm.org/rL307100, after this change linking the FreeBSD aarch64 kernel results in lld segfaulting:

Thread 1 received signal SIGSEGV, Segmentation fault.
lld::elf::OutputSection::addSection (this=0x0, S=0x813b2d008)
at /home/dim/src/llvm-trunk/tools/lld/ELF/OutputSections.cpp:84
84 Sections.push_back(S);
(gdb) bt
#​0 lld::elf::OutputSection::addSection (this=0x0, S=0x813b2d008) at /home/dim/src/llvm-trunk/tools/lld/ELF/OutputSections.cpp:84
#​1 0x00000000009506eb in (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::support::endianness)1, true> >::addPredefinedSections (this=0x7fffffff6e30) at /home/dim/src/llvm-trunk/tools/lld/ELF/Writer.cpp:1338
#​2 0x0000000000949423 in (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::support::endianness)1, true> >::finalizeSections (this=0x7fffffff6e30) at /home/dim/src/llvm-trunk/tools/lld/ELF/Writer.cpp:1243
#​3 0x0000000000914495 in (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::support::endianness)1, true> >::run (this=0x7fffffff6e30) at /home/dim/src/llvm-trunk/tools/lld/ELF/Writer.cpp:207
#​4 0x0000000000973192 in lld::elf::writeResult<llvm::object::ELFType<(llvm::support::endianness)1, true> > () at /home/dim/src/llvm-trunk/tools/lld/ELF/Writer.cpp:126
#​5 0x000000000066c7ff in lld::elf::LinkerDriver::link<llvm::object::ELFType<(llvm::support::endianness)1, true> > (this=0x805ce2000, Args=...) at /home/dim/src/llvm-trunk/tools/lld/ELF/Driver.cpp:1056
#​6 0x0000000000655585 in lld::elf::LinkerDriver::main (this=0x805ce2000, ArgsArr=..., CanExitEarly=true) at /home/dim/src/llvm-trunk/tools/lld/ELF/Driver.cpp:386
#​7 0x00000000006547a3 in lld::elf::link (Args=..., CanExitEarly=true, Error=...) at /home/dim/src/llvm-trunk/tools/lld/ELF/Driver.cpp:85
#​8 0x0000000000457809 in main (Argc=1245, Argv=0x7fffffff8580) at /home/dim/src/llvm-trunk/tools/lld/tools/lld/lld.cpp:104
(gdb) up
#​1 0x00000000009506eb in (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::support::endianness)1, true> >::addPredefinedSections (this=0x7fffffff6e30) at /home/dim/src/llvm-trunk/tools/lld/ELF/Writer.cpp:1338
1338 Cmd->Sec->addSection(Sentinel);
(gdb) print Cmd->Sec
$5 = (lld::elf::OutputSection *) 0x0

At this point findSectionCommand() was looping through Script->Opt.Commands, found a not-completely initialized .ARM.exidx section, which still had its null Sec member.

Reverting the findSectionCommand() implementation to its previous version prevents crashing, but it may not be the correct solution

The reproduction test case is unfortunately too large to be attached, find it here:
http://www.andric.com/freebsd/clang/lld-arm64-segfault.tar.xz (18 MiB)

@emaste
Copy link
Member

emaste commented Jul 18, 2017

Reproducible at r308300, and with --no-threads.

(gdb) frame
#​2 0x00000000019ee7ab in (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::support::endianness)1, true> >::addPredefinedSections (this=0x7ffffffddae8) at ../tools/lld/ELF/Writer.cpp:1337
1337 Cmd->Sec->addSection(Sentinel);
(gdb) p Cmd->Sec
$4 = (lld::elf::OutputSection *) 0x0

With this change:

  • if (!Cmd || Cmd->Commands.empty() || Config->Relocatable)
  • if (!Cmd || !Cmd->Sec || Cmd->Commands.empty() || Config->Relocatable)
    lld does not crash on the kernel link and passes the test suite.

(Using GDB because LLDB 5.0.0 is currently broken too.)

@llvmbot
Copy link
Collaborator

llvmbot commented Jul 18, 2017

Sorry for the delay. Looking at it now.

@llvmbot
Copy link
Collaborator

llvmbot commented Jul 18, 2017

Fixed in r308382.

@llvmbot
Copy link
Collaborator

llvmbot commented Jul 18, 2017

Reproducible at r308300, and with --no-threads.

(gdb) frame
#​2 0x00000000019ee7ab in (anonymous
namespace)::Writer<llvm::object::ELFType<(llvm::support::endianness)1, true>

::addPredefinedSections (this=0x7ffffffddae8) at
../tools/lld/ELF/Writer.cpp:1337
1337 Cmd->Sec->addSection(Sentinel);
(gdb) p Cmd->Sec
$4 = (lld::elf::OutputSection *) 0x0

With this change:

  • if (!Cmd || Cmd->Commands.empty() || Config->Relocatable)
  • if (!Cmd || !Cmd->Sec || Cmd->Commands.empty() || Config->Relocatable)
    lld does not crash on the kernel link and passes the test suite.

Sorry, I just noticed this. Yes, that was the correct change. I had in mind only the synthetic linkerscirpt case when I first wrote it.

@emaste
Copy link
Member

emaste commented Jul 18, 2017

No worries.

I can confirm that with my original change (emaste/freebsd@1d3dfff) a lld-linked FreeBSD/arm64 kernel and world works (tested on a SoftIron OverDrive 1000).

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 10, 2021
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bugzilla Issues migrated from bugzilla lld:ELF
Projects
None yet
Development

No branches or pull requests

3 participants