[LLD] [COFF] Fix handling of comdat .drectve sections (#68116)
This can happen when manually emitting strings into .drectve sections
with `__attribute__((section(".drectve")))`, which is a way to emulate
`#pragma comment(linker, "...")` for mingw compilers, without requiring
building with -fms-extensions.
Normally, this doesn't generate any comdat, but if compiled with
-fsanitize=address, this section does get turned into a comdat section.
This fixes #67261. This issue can be seen as a regression; a change in
the "lli" tool in 17.x triggers this case, if compiled with ASAN
enabled, triggering this unsupported corner case in LLD. With this
change, LLD can handle it.
This commit is contained in:
@@ -661,6 +661,8 @@ std::optional<Symbol *> ObjFile::createDefined(
|
||||
if (prevailing) {
|
||||
SectionChunk *c = readSection(sectionNumber, def, getName());
|
||||
sparseChunks[sectionNumber] = c;
|
||||
if (!c)
|
||||
return nullptr;
|
||||
c->sym = cast<DefinedRegular>(leader);
|
||||
c->selection = selection;
|
||||
cast<DefinedRegular>(leader)->data = &c->repl;
|
||||
|
||||
31
lld/test/COFF/comdat-drectve.s
Normal file
31
lld/test/COFF/comdat-drectve.s
Normal file
@@ -0,0 +1,31 @@
|
||||
# REQUIRES: x86
|
||||
|
||||
# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.obj
|
||||
|
||||
# RUN: lld-link %t.obj -out:%t.exe -debug:symtab -subsystem:console
|
||||
# RUN: llvm-readobj --coff-exports %t.exe | FileCheck %s
|
||||
|
||||
# CHECK: Name: exportedFunc
|
||||
|
||||
## This assembly snippet has been reduced from what Clang generates from
|
||||
## this C snippet, with -fsanitize=address. Normally, the .drectve
|
||||
## section would be a regular section - but when compiled with
|
||||
## -fsanitize=address, it becomes a comdat section.
|
||||
##
|
||||
# void exportedFunc(void) {}
|
||||
# void mainCRTStartup(void) {}
|
||||
# static __attribute__((section(".drectve"), used)) const char export_chkstk[] =
|
||||
# "-export:exportedFunc";
|
||||
|
||||
.text
|
||||
.globl exportedFunc
|
||||
exportedFunc:
|
||||
retq
|
||||
|
||||
.globl mainCRTStartup
|
||||
mainCRTStartup:
|
||||
retq
|
||||
|
||||
.section .drectve,"dr",one_only,export_chkstk
|
||||
export_chkstk:
|
||||
.asciz "-export:exportedFunc"
|
||||
Reference in New Issue
Block a user