1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

axxのlinuxでの実用へ向けての試験的適用 リロケータブルELFと実行ファイルの作成 [ axl ,rel ]

Last updated at Posted at 2024-11-10

これは、axxのlinuxで動作するバージョンです。

今の所、同一セクション内ですが、リロケータブルELFを作り、リンクすると実行ファイルができるところまで行ってます。

ソース

使い方

アセンブル

axxのオプションは、-Eを指定すると、ELF用のセクションフラグを付加する。

./axx.py hello.axx hello.s -o hello.bin -E hello.tsv

リロケータブルELF作成スクリプト

rel
#!/usr/bin/zsh

# 引数の確認
if [ $# -ne 3 ]; then
    echo "Usage: $0 <tsv_file> <raw_binary> <output_elf>"
    exit 1
fi

TSV_FILE=$1
RAW_BINARY=$2
OUTPUT_ELF=$3

# 一時ファイルの作成
TEMP_LD_SCRIPT=$(mktemp)
TEMP_OBJ=$(mktemp)

# リンカスクリプトの生成
echo "SECTIONS {" > $TEMP_LD_SCRIPT
while IFS=$'\t' read -r section_name start_addr size flags || [ -n "$section_name" ]; do
    if [[ -v "$size" ]]; then
        echo "  $section_name $start_addr : { *($section_name) } : $flags" >> $TEMP_LD_SCRIPT
    fi
done < $TSV_FILE
echo "}" >> $TEMP_LD_SCRIPT

# rawバイナリをオブジェクトファイルに変換
objcopy -I binary -O elf64-x86-64 --rename-section .data=.text $RAW_BINARY $TEMP_OBJ

# リロケータブルELFファイルの作成
ld -r -o $OUTPUT_ELF -T $TEMP_LD_SCRIPT $TEMP_OBJ

# シンボルの追加
while IFS=$'\t' read -r label_name address size flags || [ -n "$label_name" ]; do
    if [[ -z "$size" ]]; then
        objcopy --add-symbol $label_name=$address $OUTPUT_ELF
    fi
done < $TSV_FILE

# 一時ファイルの削除
rm $TEMP_LD_SCRIPT $TEMP_OBJ

echo "Created $OUTPUT_ELF"

オブジェクトファイル作成・リンク・実行

リロケータブルオブジェクトファイルを作る
$ ./rel hello.tsv hello.bin hello.o                   
Created hello.o
リンク
$ ld hello.o -o hello
実行
$ hello                                             
hello, world
$ 

一応できました。まだ、セクションの区分けと、シンボルのインポート関係が残されてます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?