🌵
lld では linker script内で "-="は使えない?
はじめに
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