🌵

lld では linker script内で "-="は使えない?

2021/04/18に公開

はじめに

lldを使用していて、リンカスクリプトでエラーが出たのでエラーが出た内容を記載。
以下に再現例を記載しますが、そもそも確認方法が悪い、とかあったら
指摘をもらえるとありがたいです。

サンプル

以下のようなコードを用意します。

sample.c
int value;
char buffer[100];

void func1() { value += 1; }
void func2() { value += 2; }
void func3() { value += 4; }

int main()
{
    value = 0;
    func1();
    func2();
    func3();
}

次に、以下のようなリンカスクリプトを用意します。

sample.ld
SECTIONS
{
    sample = 0;
    sample += 1;
    sample -= 1;
    . = 0x08048000 + SIZEOF_HEADERS;
    .text : {*(.text)}
    .rodata : {*(.rodata)}
    .data : {*(.data)}
    .bss : {*(.bss)}
}

gccでコンパイルしてみます。
コンパイルは成功します(a.outが作成されます)。

$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10-2020-q4-major) 10.2.1 20201103 (release)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ arm-none-eabi-gcc -mcpu=cortex-m4 -nostartfiles -nodefaultlibs  overwrite.c -T sample.ld 
$ file a.out
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

clangでコンパイルすると、以下のようにリンクで失敗します。

$ clang --version
clang version 11.0.0 (https://github.com/llvm/llvm-project.git 0160ad802e899c2922bc9b29564080c22eb0908c)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/saitoyutaka/clang/clang+llvm-11.0.0-x86_64-linux-gnu-ubuntu-20.04/bin
$ clang -target arm-none-eabi -march=armv7-m -mcpu=cortex-m4 -nodefaultlibs overwrite.c -T sample.ld
ld.lld: error: sample.ld:5: malformed number: =
>>>     sample -= 1;
>>>             ^
clang-11: error: ld.lld command failed with exit code 1 (use -v to see invocation)

lldのlinker scriptについて

Linker Script implementation notes and policyにlinker scriptについての
記載があるけど、よくわからなかった。。。
linker scriptのドキュメントはここ

とりあえずの対処

以下のように修正をするとclangでもビルドはできる
(sample = sample - 1;でエラーにはならない)

SECTIONS
{
    sample = 0;
    sample += 1;
    sample = sample - 1;
    . = 0x08048000 + SIZEOF_HEADERS;
    .text : {*(.text)}
    .rodata : {*(.rodata)}
    .data : {*(.data)}
    .bss : {*(.bss)}
}

現時点での動作から私が思っていること

lld では linker script内で "-="は使えない。
(違っていたらご指摘ください)

Discussion