Skip to content

Commit

Permalink
[ELF] - Linkerscript: implemented SUBALIGN() command.
Browse files Browse the repository at this point in the history
You can force input section alignment within an output section by using SUBALIGN. The
value specified overrides any alignment given by input sections, whether larger or smaller.

SUBALIGN is used in many projects in the wild.

Differential revision: https://reviews.llvm.org/D23063

llvm-svn: 279256
  • Loading branch information
George Rimar committed Aug 19, 2016
1 parent 0b86722 commit db24d9c
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
9 changes: 8 additions & 1 deletion lld/ELF/LinkerScript.cpp
Expand Up @@ -283,9 +283,14 @@ void LinkerScript<ELFT>::createSections(OutputSectionFactory<ELFT> &Factory) {
std::tie(OutSec, IsNew) = Factory.create(Head, Cmd->Name);
if (IsNew)
OutputSections->push_back(OutSec);
for (InputSectionBase<ELFT> *Sec : V)

uint32_t Subalign = Cmd->SubalignExpr ? Cmd->SubalignExpr(0) : 0;
for (InputSectionBase<ELFT> *Sec : V) {
if (Subalign)
Sec->Alignment = Subalign;
if (!Sec->OutSec)
OutSec->addSection(Sec);
}
}
}

Expand Down Expand Up @@ -937,6 +942,8 @@ ScriptParser::readOutputSectionDescription(StringRef OutSec) {
Cmd->LmaExpr = readParenExpr();
if (skip("ALIGN"))
Cmd->AlignExpr = readParenExpr();
if (skip("SUBALIGN"))
Cmd->SubalignExpr = readParenExpr();

// Parse constraints.
if (skip("ONLY_IF_RO"))
Expand Down
1 change: 1 addition & 0 deletions lld/ELF/LinkerScript.h
Expand Up @@ -81,6 +81,7 @@ struct OutputSectionCommand : BaseCommand {
Expr AddrExpr;
Expr AlignExpr;
Expr LmaExpr;
Expr SubalignExpr;
std::vector<std::unique_ptr<BaseCommand>> Commands;
std::vector<StringRef> Phdrs;
std::vector<uint8_t> Filler;
Expand Down
43 changes: 43 additions & 0 deletions lld/test/ELF/linkerscript/linkerscript-subalign.s
@@ -0,0 +1,43 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o

# RUN: echo "SECTIONS { .aaa : { *(.aaa.*) } }" > %t1.script
# RUN: ld.lld -o %t1 --script %t1.script %t1.o
# RUN: llvm-objdump -s %t1 | FileCheck -check-prefix=NOALIGN %s
# NOALIGN: Contents of section .aaa:
# NOALIGN-NEXT: 01000000 00000000 00000000 00000000
# NOALIGN-NEXT: 00000000 00000000 00000000 00000000
# NOALIGN-NEXT: 02000000 00000000 00000000 00000000
# NOALIGN-NEXT: 00000000 00000000 00000000 00000000
# NOALIGN-NEXT: 03000000 00000000 00000000 00000000
# NOALIGN-NEXT: 00000000 00000000 00000000 00000000
# NOALIGN-NEXT: 00000000 00000000 00000000 00000000
# NOALIGN-NEXT: 00000000 00000000 00000000 00000000
# NOALIGN-NEXT: 04000000 00000000

# RUN: echo "SECTIONS { .aaa : SUBALIGN(1) { *(.aaa.*) } }" > %t2.script
# RUN: ld.lld -o %t2 --script %t2.script %t1.o
# RUN: llvm-objdump -s %t2 | FileCheck -check-prefix=SUBALIGN %s
# SUBALIGN: Contents of section .aaa:
# SUBALIGN: 01000000 00000000 02000000 00000000
# SUBALIGN: 03000000 00000000 04000000 00000000

.global _start
_start:
nop

.section .aaa.1, "a"
.align 16
.quad 1

.section .aaa.2, "a"
.align 32
.quad 2

.section .aaa.3, "a"
.align 64
.quad 3

.section .aaa.4, "a"
.align 128
.quad 4

0 comments on commit db24d9c

Please sign in to comment.