gcc実験メモ(4)

はじめに ターゲットをRiscVにして作成したELFファイルのテキスト領域を解釈する、というのをもう一度行う。 今度は少しだけ複雑にするが、まだ簡単である。結果だけ載せる。 題材1 Cコード int add(int a, int b) { return a + b; } コマンド FILE=add_sub_risc; clang --target=riscv64-linux-musl -static -c -o $FILE.o -fuse-ld=lld $FILE.c riscv64-unknown-elf-objdump --disassemble $FILE.o オブジェクトファイルのRiscV命令列 0000000000000000 <add>: 0: 1101 addi sp,sp,-32 2: ec06 sd ra,24(sp) 4: e822 sd s0,16(sp) 6: 1000 addi s0,sp,32 8: fea42623 sw a0,-20(s0) c: feb42423 sw a1,-24(s0) 10: fec42503 lw a0,-20(s0) 14: fe842583 lw a1,-24(s0) 18: 9d2d addw a0,a0,a1 1a: 60e2 ld ra,24(sp) 1c: 6442 ld s0,16(sp) 1e: 6105 addi sp,sp,32 20: 8082 ret 解釈 関数のセットアップ処理 sp -= 32 [sp + 24] = ra [sp + 16] = s0 s0 = sp + 32 関数の処理 変数int aがs0-20に対応。 a0の値をaに保存。aは4byteなので、32bit。 ...

March 21, 2025

gcc実験メモ(3)

はじめに x86はやはり疲れるので、一旦RiscVで進めることに方針転換した。 あと、せっかく先進的なRiscVを使うなら、他のツールも新しくしたいと思い、clangでコンパイルした。 もはやgccではないが、シリーズ化して作ってしまっているのでこのまま進める。 本題 下記のCコードをRiscV向けにコンパイルのみして、オブジェクトファイルを作成した。 riscv64-unknown-elf-objdumpで、このファイルをdisassembleした。 int main() { return 0; } コマンド riscv64-unknown-elf-objdump --disassemble $FILE.o 眺めると、sw以外は2byteの命令になっており、圧縮命令(RVC)が多用されていることが分かる。 結果 Disassembly of section .text: 0000000000000000 <main>: 0: 1101 addi sp,sp,-32 2: ec06 sd ra,24(sp) 4: e822 sd s0,16(sp) 6: 1000 addi s0,sp,32 8: 4501 li a0,0 a: fea42623 sw a0,-20(s0) e: 60e2 ld ra,24(sp) 10: 6442 ld s0,16(sp) 12: 6105 addi sp,sp,32 14: 8082 ret 読みづらいので、手で書き換えた。 sp -= 32 [24 + sp] = ra [16 + sp] = s0 s0 = sp + 32 a0 = 0 [-20 + sp] = a0[31:0] ra = [24 + sp] s0 = [16 + sp] sp += 32 まずスタックポインタを32引く(下に進むということと思われる)。 レジスタサイズは64bit(8byte)なので、ローカル変数用に4つの値を格納できるようにメモリを確保したと言える。 ...

March 20, 2025

gcc実験メモ(2)

はじめに もう少し複雑なCファイルを題材にELFファイル(今回もオブジェクトファイル)を読み解いていく。 題材(特に理由はないが、zero.c) char first_word[] = "あいうえお"; char *second_word = "banana"; char zero; char one = '1'; int two; コマンド gcc -c zero.c -o zero.o xxd ./zero.o 結果 00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ 00000010: 0100 3e00 0100 0000 0000 0000 0000 0000 ..>............. 00000020: 0000 0000 0000 0000 3802 0000 0000 0000 ........8....... 00000030: 0000 0000 4000 0000 0000 4000 0d00 0c00 ....@.....@..... 00000040: e381 82e3 8184 e381 86e3 8188 e381 8a00 ................ 00000050: 3100 0000 6261 6e61 6e61 0000 0000 0000 1...banana...... 00000060: 0000 0000 0000 0000 0047 4343 3a20 2855 .........GCC: (U 00000070: 6275 6e74 7520 3133 2e33 2e30 2d36 7562 buntu 13.3.0-6ub 00000080: 756e 7475 327e 3234 2e30 3429 2031 332e untu2~24.04) 13. 00000090: 332e 3000 0000 0000 0400 0000 1000 0000 3.0............. 000000a0: 0500 0000 474e 5500 0200 00c0 0400 0000 ....GNU......... 000000b0: 0300 0000 0000 0000 0000 0000 0000 0000 ................ 000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000d0: 0100 0000 0400 f1ff 0000 0000 0000 0000 ................ 000000e0: 0000 0000 0000 0000 0000 0000 0300 0400 ................ 000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000100: 0800 0000 1100 0200 0000 0000 0000 0000 ................ 00000110: 1000 0000 0000 0000 1300 0000 1100 0500 ................ 00000120: 0000 0000 0000 0000 0800 0000 0000 0000 ................ 00000130: 1f00 0000 1100 0300 0000 0000 0000 0000 ................ 00000140: 0100 0000 0000 0000 2400 0000 1100 0200 ........$....... 00000150: 1000 0000 0000 0000 0100 0000 0000 0000 ................ 00000160: 2800 0000 1100 0300 0400 0000 0000 0000 (............... 00000170: 0400 0000 0000 0000 007a 6572 6f2e 6300 .........zero.c. 00000180: 6669 7273 745f 776f 7264 0073 6563 6f6e first_word.secon 00000190: 645f 776f 7264 007a 6572 6f00 6f6e 6500 d_word.zero.one. 000001a0: 7477 6f00 0000 0000 0000 0000 0000 0000 two............. 000001b0: 0100 0000 0200 0000 0000 0000 0000 0000 ................ 000001c0: 002e 7379 6d74 6162 002e 7374 7274 6162 ..symtab..strtab 000001d0: 002e 7368 7374 7274 6162 002e 7465 7874 ..shstrtab..text 000001e0: 002e 6461 7461 002e 6273 7300 2e72 6f64 ..data..bss..rod 000001f0: 6174 6100 2e72 656c 612e 6461 7461 2e72 ata..rela.data.r 00000200: 656c 2e6c 6f63 616c 002e 636f 6d6d 656e el.local..commen 00000210: 7400 2e6e 6f74 652e 474e 552d 7374 6163 t..note.GNU-stac 00000220: 6b00 2e6e 6f74 652e 676e 752e 7072 6f70 k..note.gnu.prop 00000230: 6572 7479 0000 0000 0000 0000 0000 0000 erty............ 00000240: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000250: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000260: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000270: 0000 0000 0000 0000 1b00 0000 0100 0000 ................ 00000280: 0600 0000 0000 0000 0000 0000 0000 0000 ................ 00000290: 4000 0000 0000 0000 0000 0000 0000 0000 @............... 000002a0: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 000002b0: 0000 0000 0000 0000 2100 0000 0100 0000 ........!....... 000002c0: 0300 0000 0000 0000 0000 0000 0000 0000 ................ 000002d0: 4000 0000 0000 0000 1100 0000 0000 0000 @............... 000002e0: 0000 0000 0000 0000 1000 0000 0000 0000 ................ 000002f0: 0000 0000 0000 0000 2700 0000 0800 0000 ........'....... 00000300: 0300 0000 0000 0000 0000 0000 0000 0000 ................ 00000310: 5400 0000 0000 0000 0800 0000 0000 0000 T............... 00000320: 0000 0000 0000 0000 0400 0000 0000 0000 ................ 00000330: 0000 0000 0000 0000 2c00 0000 0100 0000 ........,....... 00000340: 0200 0000 0000 0000 0000 0000 0000 0000 ................ 00000350: 5400 0000 0000 0000 0700 0000 0000 0000 T............... 00000360: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000370: 0000 0000 0000 0000 3900 0000 0100 0000 ........9....... 00000380: 0300 0000 0000 0000 0000 0000 0000 0000 ................ 00000390: 6000 0000 0000 0000 0800 0000 0000 0000 `............... 000003a0: 0000 0000 0000 0000 0800 0000 0000 0000 ................ 000003b0: 0000 0000 0000 0000 3400 0000 0400 0000 ........4....... 000003c0: 4000 0000 0000 0000 0000 0000 0000 0000 @............... 000003d0: a801 0000 0000 0000 1800 0000 0000 0000 ................ 000003e0: 0a00 0000 0500 0000 0800 0000 0000 0000 ................ 000003f0: 1800 0000 0000 0000 4900 0000 0100 0000 ........I....... 00000400: 3000 0000 0000 0000 0000 0000 0000 0000 0............... 00000410: 6800 0000 0000 0000 2c00 0000 0000 0000 h.......,....... 00000420: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000430: 0100 0000 0000 0000 5200 0000 0100 0000 ........R....... 00000440: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000450: 9400 0000 0000 0000 0000 0000 0000 0000 ................ 00000460: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000470: 0000 0000 0000 0000 6200 0000 0700 0000 ........b....... 00000480: 0200 0000 0000 0000 0000 0000 0000 0000 ................ 00000490: 9800 0000 0000 0000 2000 0000 0000 0000 ........ ....... 000004a0: 0000 0000 0000 0000 0800 0000 0000 0000 ................ 000004b0: 0000 0000 0000 0000 0100 0000 0200 0000 ................ 000004c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004d0: b800 0000 0000 0000 c000 0000 0000 0000 ................ 000004e0: 0b00 0000 0300 0000 0800 0000 0000 0000 ................ 000004f0: 1800 0000 0000 0000 0900 0000 0300 0000 ................ 00000500: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000510: 7801 0000 0000 0000 2c00 0000 0000 0000 x.......,....... 00000520: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000530: 0000 0000 0000 0000 1100 0000 0300 0000 ................ 00000540: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000550: c001 0000 0000 0000 7500 0000 0000 0000 ........u....... 00000560: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000570: 0000 0000 0000 0000 ........ program ヘッダ 例によって今回もオブジェクトファイルのため、特にないので省略。 ...

March 16, 2025

gcc実験メモ(1)

はじめに gccに入門したのでメモ gccは何をしているのか 「プリプロセシング」「コンパイル」「リンク」を順番に行っている。 Cファイルごとにプリプロセシング、コンパイルを行い、 Cファイルごとにオブジェクトファイルを生成する。 最後に、リンクによりmain関数が含まれるCファイルをエントリーポイントとする実行可能ELFファイルを作成する。 シンプルなCファイルで実験してみる まずはファイルを作成。 # hello_const.c const char msg[] = "Hello World" コンパイルのみ行ってオブジェクトファイルを作成。 gcc -c hello_const.c -o hello_const.o 中身を見てみる。 コマンド xxd ./hello_const.o 結果 00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ 00000010: 0100 3e00 0100 0000 0000 0000 0000 0000 ..>............. 00000020: 0000 0000 0000 0000 5801 0000 0000 0000 ........X....... 00000030: 0000 0000 4000 0000 0000 4000 0b00 0a00 ....@.....@..... 00000040: 4865 6c6c 6f20 576f 726c 6400 0047 4343 Hello World..GCC 00000050: 3a20 2855 6275 6e74 7520 3133 2e33 2e30 : (Ubuntu 13.3.0 00000060: 2d36 7562 756e 7475 327e 3234 2e30 3429 -6ubuntu2~24.04) 00000070: 2031 332e 332e 3000 0400 0000 1000 0000 13.3.0......... 00000080: 0500 0000 474e 5500 0200 00c0 0400 0000 ....GNU......... 00000090: 0300 0000 0000 0000 0000 0000 0000 0000 ................ 000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000b0: 0100 0000 0400 f1ff 0000 0000 0000 0000 ................ 000000c0: 0000 0000 0000 0000 0f00 0000 1100 0400 ................ 000000d0: 0000 0000 0000 0000 0c00 0000 0000 0000 ................ 000000e0: 0068 656c 6c6f 5f63 6f6e 7374 2e63 006d .hello_const.c.m 000000f0: 7367 0000 2e73 796d 7461 6200 2e73 7472 sg...symtab..str 00000100: 7461 6200 2e73 6873 7472 7461 6200 2e74 tab..shstrtab..t 00000110: 6578 7400 2e64 6174 6100 2e62 7373 002e ext..data..bss.. 00000120: 726f 6461 7461 002e 636f 6d6d 656e 7400 rodata..comment. 00000130: 2e6e 6f74 652e 474e 552d 7374 6163 6b00 .note.GNU-stack. 00000140: 2e6e 6f74 652e 676e 752e 7072 6f70 6572 .note.gnu.proper 00000150: 7479 0000 0000 0000 0000 0000 0000 0000 ty.............. 00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000190: 0000 0000 0000 0000 1b00 0000 0100 0000 ................ 000001a0: 0600 0000 0000 0000 0000 0000 0000 0000 ................ 000001b0: 4000 0000 0000 0000 0000 0000 0000 0000 @............... 000001c0: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 000001d0: 0000 0000 0000 0000 2100 0000 0100 0000 ........!....... 000001e0: 0300 0000 0000 0000 0000 0000 0000 0000 ................ 000001f0: 4000 0000 0000 0000 0000 0000 0000 0000 @............... 00000200: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000210: 0000 0000 0000 0000 2700 0000 0800 0000 ........'....... 00000220: 0300 0000 0000 0000 0000 0000 0000 0000 ................ 00000230: 4000 0000 0000 0000 0000 0000 0000 0000 @............... 00000240: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000250: 0000 0000 0000 0000 2c00 0000 0100 0000 ........,....... 00000260: 0200 0000 0000 0000 0000 0000 0000 0000 ................ 00000270: 4000 0000 0000 0000 0c00 0000 0000 0000 @............... 00000280: 0000 0000 0000 0000 0800 0000 0000 0000 ................ 00000290: 0000 0000 0000 0000 3400 0000 0100 0000 ........4....... 000002a0: 3000 0000 0000 0000 0000 0000 0000 0000 0............... 000002b0: 4c00 0000 0000 0000 2c00 0000 0000 0000 L.......,....... 000002c0: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 000002d0: 0100 0000 0000 0000 3d00 0000 0100 0000 ........=....... 000002e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002f0: 7800 0000 0000 0000 0000 0000 0000 0000 x............... 00000300: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000310: 0000 0000 0000 0000 4d00 0000 0700 0000 ........M....... 00000320: 0200 0000 0000 0000 0000 0000 0000 0000 ................ 00000330: 7800 0000 0000 0000 2000 0000 0000 0000 x....... ....... 00000340: 0000 0000 0000 0000 0800 0000 0000 0000 ................ 00000350: 0000 0000 0000 0000 0100 0000 0200 0000 ................ 00000360: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000370: 9800 0000 0000 0000 4800 0000 0000 0000 ........H....... 00000380: 0900 0000 0200 0000 0800 0000 0000 0000 ................ 00000390: 1800 0000 0000 0000 0900 0000 0300 0000 ................ 000003a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003b0: e000 0000 0000 0000 1300 0000 0000 0000 ................ 000003c0: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 000003d0: 0000 0000 0000 0000 1100 0000 0300 0000 ................ 000003e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003f0: f300 0000 0000 0000 6000 0000 0000 0000 ........`....... 00000400: 0000 0000 0000 0000 0100 0000 0000 0000 ................ 00000410: 0000 0000 0000 0000 ........ ELFヘッダ コマンド ...

March 16, 2025

仮想ブリッジを試す

はじめに 仮想ブリッジを試してみたので、メモ。 構成 実験1 namespaceを新たに2つ作り、initネームスペースにあるbridgeを利用して双方向通信(ping)を行う。 # bridgeの用意 ip link add name br0 type bridge ip addr add 192.168.2.254/24 dev br0 ip link set br0 up # ns0の用意 ip netns add ns0 ip link add name veth0a type veth peer veth0b netns ns0 ip link set veth0a up ip netns exec ns0 ip link set veth0b up ip netns exec ns0 ip addr add 192.168.2.1/24 dev veth0b ip link set veth0a master br0 # ns1の用意 ip netns add ns1 ip link add name veth1a type veth peer veth1b netns ns0 ip link set veth1a up ip netns exec ns1 ip link set veth1b up ip netns exec ns0 ip addr add 192.168.2.3/24 dev veth1b ip link set veth1a master br0 # ns1に入る ip netns exec ns1 bash # ns0のveth0bへ通信 ping -c 1 192.168.2.1 -I veth1b # 上記のpingの前に、tcpdump -iを5箇所(br0, veth{0,1}{a,b})で走らせておくと、全てで見られる。私の場合は、5個のターミナルウィンドウを開いて確認した。 # ex: tcpdump -i veth0a -n 'arp or icmp' なお、理由は理解していないが、今だとbr0からns0やns1へはアクセスできない。 ...

February 21, 2025

初投稿

はじめに こんにちは、tetzakaneyaです。 このサイトは、主に技術系の記事を記載する個人ブログです。 経緯 もともとはQiitaに個人の技術ブログ記事を書いていました。 以前書いていた記事は、実際に手を動かしてみたその体験を書いたものや、学習したものを要約したものなどでした。 今でもそのような記事は書きたいのですが、直近の自分のニーズとしてChatGPTとの対話から学んだ内容を残したいことが多いです。 具体的には、ChatGPTへの質問で得られた回答をいくつかコピペしたり要約したりしたものを世間に公開しつつ自分もあとで見返せるようにする、ということをしたいことが多くなってきました。 ただ、ChatGPTとの会話メモのようなものを中心とする記事は一般に好まれるものではないと思います。将来的にQiitaの規約違反になってしまうこともあるかもしれないので、前からやりたかった個人ブログににしようと思いました。

February 20, 2025