[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:
Martin Storsjö 2023-10-04 10:54:50 +03:00 committed by GitHub
parent 9748f98116
commit 503bc5f661
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 0 deletions

View File

@ -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;

View 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"