values.c リンカ・ローダ実践開発テクニック 坂井弘亮(23) coding(137)

# リンカ・ローダ
各社のリンカ、ローダ、libralian、locator、boot loaderなどの機能を調べる上で、
「リンカ・ローダ実践開発テクニック」 坂井弘亮
は、手がかりをつかめるかもしれない。

リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術-COMPUTER-TECHNOLOGY-坂井-弘亮
https://www.amazon.co.jp//dp/4789838072/
https://bookmeter.com/books/630946
>参考文献にあるLinkers & Loadersは斜め読みしただけで、自分ではこういう道具は作らないだろうと勝手に思っていた。本書では簡易リンカの作成と、道具の作り方まで有るのがすごい。「setjmp()とlongjmp()」というコラムが１頁に入りきらず４頁になっているのに、節にしていないところも興味深い。

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.
# content
content
https://shop.cqpub.co.jp/hanbai/books/38/38071.html

ardump.c リンカ・ローダ実践開発テクニック 坂井弘亮(1) coding(89)
https://qiita.com/kaizen_nagoya/items/2a7bf3050ee6ac662272

binary.c リンカ・ローダ実践開発テクニック 坂井弘亮(2) coding(90)
https://qiita.com/kaizen_nagoya/items/23b985cefc5338677812

combine.c リンカ・ローダ実践開発テクニック 坂井弘亮(3) coding(91)
https://qiita.com/kaizen_nagoya/items/59161e3274270cfd2009

const.c, リンカ・ローダ実践開発テクニック 坂井弘亮(4) coding(92) error(123) docker(174)
https://qiita.com/kaizen_nagoya/items/6f74dbf637a91685d0d1

constructor.c リンカ・ローダ実践開発テクニック 坂井弘亮(5) coding(93)
https://qiita.com/kaizen_nagoya/items/37e14a0943907b6f836f

continue.c リンカ・ローダ実践開発テクニック 坂井弘亮(6) coding(95)
https://qiita.com/kaizen_nagoya/items/e124223fd49db6d9e7a2

down.c リンカ・ローダ実践開発テクニック 坂井弘亮(7) coding(96)
https://qiita.com/kaizen_nagoya/items/866449f129cc8ce4dee7

ctors.c リンカ・ローダ実践開発テクニック 坂井弘亮(8) coding(97)
https://qiita.com/kaizen_nagoya/items/135524de5f8fea10e90f

duplicate.c リンカ・ローダ実践開発テクニック 坂井弘亮(9) coding(123)
https://qiita.com/kaizen_nagoya/items/2339c517f223e556bf67

edata.c リンカ・ローダ実践開発テクニック 坂井弘亮(10) coding(124)
https://qiita.com/kaizen_nagoya/items/bbfe0d6a3c5375026c64

elfread.c リンカ・ローダ実践開発テクニック 坂井弘亮(11) coding(125)
https://qiita.com/kaizen_nagoya/items/600c4a1133dc08da215e

 edata.c リンカ・ローダ実践開発テクニック 坂井弘亮(12) coding(126)
 https://qiita.com/kaizen_nagoya/items/b6eff6b348d7cf5f257c

 hello.c リンカ・ローダ実践開発テクニック 坂井弘亮(13) coding(127)
 https://qiita.com/kaizen_nagoya/items/4af05d017d73ebe789d5

 inicialize.c リンカ・ローダ実践開発テクニック 坂井弘亮(14) coding(128)
 https://qiita.com/kaizen_nagoya/items/4feeb9ef85bfc28fd821

layer.c リンカ・ローダ実践開発テクニック 坂井弘亮(15) coding(129)
https://qiita.com/kaizen_nagoya/items/90bb95f9e538e66d2dbf

ordermain.c リンカ・ローダ実践開発テクニック 坂井弘亮(16) coding(130)
https://qiita.com/kaizen_nagoya/items/446a6768a0abdd13c8b5

pointer.c リンカ・ローダ実践開発テクニック 坂井弘亮(17) coding(131)
https://qiita.com/kaizen_nagoya/items/68cae98797c2e6018499

rasm.c リンカ・ローダ実践開発テクニック 坂井弘亮(18) coding(132)
https://qiita.com/kaizen_nagoya/items/6c3ac31457551e788163

section.c リンカ・ローダ実践開発テクニック 坂井弘亮(19) coding(133)
https://qiita.com/kaizen_nagoya/items/00aadb9a9c0a222ebce2

setjmp.c リンカ・ローダ実践開発テクニック 坂井弘亮(20) coding(134)
https://qiita.com/kaizen_nagoya/items/648200e728c982e79819

sample.c リンカ・ローダ実践開発テクニック 坂井弘亮(21) coding(135)
https://qiita.com/kaizen_nagoya/items/360d99ed47ddc4780bf2

stack_sample.c リンカ・ローダ実践開発テクニック 坂井弘亮(22) coding(136)
https://qiita.com/kaizen_nagoya/items/06a4c9eb6edd1921dca7

values.c リンカ・ローダ実践開発テクニック 坂井弘亮(23) coding(137)
https://qiita.com/kaizen_nagoya/items/84bff2d100c89df12bc2

weak.c リンカ・ローダ実践開発テクニック 坂井弘亮(24) coding(138)
https://qiita.com/kaizen_nagoya/items/2f16425c1e8fad4cf54e

N3220 Information technology — Programming languages — C N3220 working draft
https://www.open-std.org/JTC1/SC22/WG14/www/docs/n3220.pdf
N3219 Information technology — Programming languages — C ISO/IEC 9899:2023 DIS Draft
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3219.pdf

プログラムには少し手を入れています。最近の型宣言に厳しい感じで。

```c:values.c
#include <stdio.h>

extern char c;
extern int i0, i1, i2;
extern const int ci0, ci1, ci2;
extern char *p0, *p1;
extern char str[];

int main(void)
{
  printf("   c = %c\n", c);
  printf("  i0 = %d,   i1 = %d,   i2 = %d\n",  i0,  i1,  i2);
  printf(" ci0 = %d,  ci1 = %d,  ci2 = %d\n", ci0, ci1, ci2);
  printf("  p1 = %s,  str = %s\n", p1, str);
  printf("  &c = 0x%08x\n", &c);
  printf(" &i0 = 0x%08x,  &i1 = 0x%08x,  &i2 = 0x%08x\n",  &i0,  &i1,  &i2);
  printf("&ci0 = 0x%08x, &ci1 = 0x%08x, &ci2 = 0x%08x\n", &ci0, &ci1, &ci2);
  printf(" &p1 = 0x%08x, &str = 0x%08x\n", &p1, &str);
  exit (0);
}
```
mainでfuncを呼んでいる行がみあたらない。

```c:values_sub.c
char c = 'a';
int i0;
int i1 = 0;
int i2 = 1;
static int si0;
static int si1 = 0;
static int si2 = 1;
const int ci0;
const int ci1 = 0;
const int ci2 = 1;
char * p0;
char * p1 = "sample0";
char str[] = "sample1";

int func()
{
  int x = 0;
  return (x);
}
```
makefileでは一緒にビルドしている。

```makefile
values_sub_nm.out objdump.out strip.out

all :	$(OBJS)

values :	values.c values_sub.o
	echo "% gcc values.c values_sub.o -o values" > values-comp.out
	gcc values.c values_sub.o -o values >> values-comp.out 2>&1
	echo "% " >> values-comp.out

values.out :	values
	echo "% ./values" > values.out
	./values >> values.out
	echo "% " >> values.out

values_sub.o :	values_sub.c
	echo "% gcc -c values_sub.c" > values_sub.out
	gcc -c values_sub.c >> values_sub.out 2>&1
	echo "% ls values_sub.o" >> values_sub.out
	ls values_sub.o >> values_sub.out 2>&1
	echo "% " >> values_sub.out

values_nm.out :	values
	echo "% nm values" > values_nm.out
	nm values | head -n 3 >> values_nm.out
	cat ../../ellipsis.txt >> values_nm.out
	nm values | tail -n 40 >> values_nm.out
	echo "% " >> values_nm.out

values_c.out :	values
	echo -n "0x" > values_c.out
	echo -n "0x" > values_i1.out
	echo -n "0x" > values_i2.out
	echo -n "0x" > values_p1.out
	echo -n "0x" > values_str.out
	echo -n "0x" > values_si1.out
	echo -n "0x" > values_si2.out
	echo -n "0x" > values_ci0.out
	echo -n "0x" > values_i0.out
	echo -n "0x" > values_p0.out
	echo -n "0x" > values_si0.out
	echo -n "0x" > values_ci1.out
	echo -n "0x" > values_ci2.out
	echo -n "0x" > values_main.out
	echo -n "0x" > values_func.out
	nm values | grep " D c"    | awk '{print $$1}' >> values_c.out
	nm values | grep " D i1"   | awk '{print $$1}' >> values_i1.out
	nm values | grep " D i2"   | awk '{print $$1}' >> values_i2.out
	nm values | grep " D p1"   | awk '{print $$1}' >> values_p1.out
	nm values | grep " D str"  | awk '{print $$1}' >> values_str.out
	nm values | grep " d si1"  | awk '{print $$1}' >> values_si1.out
	nm values | grep " d si2"  | awk '{print $$1}' >> values_si2.out
	nm values | grep " B ci0"  | awk '{print $$1}' >> values_ci0.out
	nm values | grep " B i0"   | awk '{print $$1}' >> values_i0.out
	nm values | grep " B p0"   | awk '{print $$1}' >> values_p0.out
	nm values | grep " b si0"  | awk '{print $$1}' >> values_si0.out
	nm values | grep " R ci1"  | awk '{print $$1}' >> values_ci1.out
	nm values | grep " R ci2"  | awk '{print $$1}' >> values_ci2.out
	nm values | grep " T main" | awk '{print $$1}' >> values_main.out
	nm values | grep " T func" | awk '{print $$1}' >> values_func.out

values_sub_nm.out :	values_sub.o
	echo "% nm values_sub.o" > values_sub_nm.out
	nm values_sub.o >> values_sub_nm.out
	echo "% " >> values_sub_nm.out

objdump.out :	values
	echo "% objdump -h values" > objdump.out
	objdump -h values | head -n 5 >> objdump.out
	cat ../../ellipsis.txt >> objdump.out
	objdump -h values | head -n 29 | tail -n 8 >> objdump.out
	cat ../../ellipsis.txt >> objdump.out
	objdump -h values | head -n 41 | tail -n 2 >> objdump.out
	cat ../../rest.txt >> objdump.out

strip.out :	values objdump.out values.out
	mv values values.bak
	cp values.bak values
	echo "% ls -l values" > strip.out
	ls -l values >> strip.out
	echo "% file values" >> strip.out
	file values >> strip.out
	echo "% strip values" >> strip.out
	strip values >> strip.out
	echo "% ls -l values" >> strip.out
	ls -l values >> strip.out
	echo "% file values" >> strip.out
	file values >> strip.out
	echo "% nm values" >> strip.out
	nm values >> strip.out 2>&1
	mv values.bak values

clean :
	rm -f $(OBJS) *.o *.out
```


# エンジニアとしての考え方
ソースコードから出発してもよい。
C言語規格から出発してもよい。
コンパイラから出発してもよい。

少なくとも、３つの道はひらけている。

上記の３つの道以外の「C言語教育」には近寄らない方がいいかもしれない。

## ソースコード
何か一つのコンパイラでコンパイルしてみる。
コンパイラそのものを深掘りするよりも、
そのコンパイラで、このコードが通るようにすることに専念する。
コンパイルエラーが出たら記録する。

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

コードがプログラマの意図通りの動作をするかどうかを確認する。
validationともいう。
## C言語規格

C言語規格には、FreestandingというPosixOSを使わない仕様と、
HostedというPosixOSを使う仕様がある。

Hostedの場合には、関数がC言語の関数かPosixの関数かを調べるとよい。
https://pubs.opengroup.org/onlinepubs/9699919799/

The C++ Standard Library: clang++とg++でコンパイルしてみた(まとめ):14件
https://qiita.com/kaizen_nagoya/items/9bdfaa392443d13e5759

C++17 - The Complete Guide clang++とg++でコンパイルしてみた(まとめ):4件
https://qiita.com/kaizen_nagoya/items/c000f307e642990781e1

C++N3242, 2011, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/685b5c1a2c17c1bf1318

C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010

C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
https://qiita.com/kaizen_nagoya/items/fc957ddddd402004bb91

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

## コンパイラ
gccとClangと、Visual Studioの３つのコンパイラでコンパイルしてみるとよい。

３つのコンパイラでコンパイルできるコードは、Portabilityがあると言えるかもしれない。

gcc/g++(GNU) v.s. Clang/Clang++(LLVM) コンパイラ警告等比較、Error(13), C++(36)
https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da
## OS
posix
https://pubs.opengroup.org/onlinepubs/9699919799/

## 関数調査
C言語と、POSIXで検索する。

### main
see 
https://qiita.com/kaizen_nagoya/items/2a7bf3050ee6ac662272

### printf
see
https://qiita.com/kaizen_nagoya/items/2a7bf3050ee6ac662272
## exit
see 
https://qiita.com/kaizen_nagoya/items/23b985cefc5338677812

## nmコマンド
nm(1) — Linux manual page
https://man7.org/linux/man-pages/man1/nm.1.html
>       nm - list symbols from object files

## awk コマンド
AWK in brief
http://awklang.org/

「gawkで基本 統計(49)量を計算する」をdocker(79)で
https://qiita.com/kaizen_nagoya/items/c362cb343a412fe12d46



# 関連資料
' @kazuo_reve 私が効果を確認した「小川メソッド」
https://qiita.com/kazuo_reve/items/a3ea1d9171deeccc04da

' @kazuo_reve 新人の方によく展開している有益な情報
https://qiita.com/kazuo_reve/items/d1a3f0ee48e24bba38f1

' @kazuo_reve Vモデルについて勘違いしていたと思ったこと
https://qiita.com/kazuo_reve/items/46fddb094563bd9b2e1e
## 自己記事一覧
プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

逆も真：社会人が最初に確かめるとよいこと。OSEK(69)、Ethernet(59)
https://qiita.com/kaizen_nagoya/items/39afe4a728a31b903ddc

「何を」よりも「誰を」。１０年後のために今見習いたい人たち
https://qiita.com/kaizen_nagoya/items/8045978b16eb49d572b2

Qiitaの記事に３段階または５段階で到達するための方法
https://qiita.com/kaizen_nagoya/items/6e9298296852325adc5e

物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

量子(0) 計算機, 量子力学 
https://qiita.com/kaizen_nagoya/items/1cd954cb0eed92879fd4

数学関連記事１００
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

統計(0)一覧
https://qiita.com/kaizen_nagoya/items/80d3b221807e53e88aba

図(0) state, sequence and timing. UML and お絵描き 
https://qiita.com/kaizen_nagoya/items/60440a882146aeee9e8f

品質一覧 
https://qiita.com/kaizen_nagoya/items/2b99b8e9db6d94b2e971

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事一覧
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

転職(0)一覧
https://qiita.com/kaizen_nagoya/items/f77520d378d33451d6fe

仮説（0）一覧（目標100現在40）
https://qiita.com/kaizen_nagoya/items/f000506fe1837b3590df

音楽　一覧(0) 
https://qiita.com/kaizen_nagoya/items/b6e5f42bbfe3bbe40f5d

「@kazuo_reve 新人の方によく展開している有益な情報」確認一覧 
https://qiita.com/kaizen_nagoya/items/b9380888d1e5a042646b

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

鉄道（０）鉄道のシステム考察はてっちゃんがてつだってくれる
https://qiita.com/kaizen_nagoya/items/26bda595f341a27901a0

安全（0）安全工学シンポジウムに向けて: 21
https://qiita.com/kaizen_nagoya/items/c5d78f3def8195cb2409

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

OSEK OS設計の基礎　OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding(0) Rules, C, Secure, MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

coding (101) 一覧を作成し始めた。omake:最近のQiitaで表示しない5つの事象
https://qiita.com/kaizen_nagoya/items/20667f09f19598aedb68

プログラマによる、プログラマのための、統計(0)と確率のプログラミングとその後
https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

Python(0)記事をまとめたい。
https://qiita.com/kaizen_nagoya/items/088c57d70ab6904ebb53

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

「はじめての」シリーズ　 ベクタージャパン　
https://qiita.com/kaizen_nagoya/items/2e41634f6e21a3cf74eb

AUTOSAR(0)Qiita記事一覧, OSEK(75)
https://qiita.com/kaizen_nagoya/items/89c07961b59a8754c869

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

LaTeX(0) 一覧　
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

Rust(0) 一覧　
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

100以上いいねをいただいた記事16選
https://qiita.com/kaizen_nagoya/items/f8d958d9084ffbd15d2a

小川清最終講義、最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on my individual experience. It has nothing to do with the organization or business to which I currently belong.
### 文書履歴(document history)
ver. 0.01 初稿 　20240720
### 最後までおよみいただきありがとう4ざいました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.