0
0

リンカ・ローダ

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

リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術-COMPUTER-TECHNOLOGY-坂井-弘亮
https://www.amazon.co.jp//dp/4789838072/
https://bookmeter.com/books/630946

参考文献にあるLinkers & Loadersは斜め読みしただけで、自分ではこういう道具は作らないだろうと勝手に思っていた。本書では簡易リンカの作成と、道具の作り方まで有るのがすごい。「setjmp()とlongjmp()」というコラムが1頁に入りきらず4頁になっているのに、節にしていないところも興味深い。

<この項は書きかけです。順次追記します。>
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

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

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

sample.c
#include <stdio.h>

int extvalue = 1;
int extbssvalue;
static int value = 2;
static int bssvalue;

static int func(int a)
{
  printf("func()\n");
  printf("func():extvalue    = %d\n", extvalue);
  printf("func():extbssvalue = %d\n", extbssvalue);
  printf("func():value       = %d\n", value);
  printf("func():bssvalue    = %d\n", bssvalue);
  return (a + extvalue + extbssvalue + value + bssvalue);
}

int extfunc(int a)
{
  int ret;
  printf("extfunc()\n");
  ret = func(a);
  return (ret);
}

mainはmain

main.c
#include <stdio.h>

extern int extvalue;
extern int extbssvalue;
extern int extfunc(int a);

int main()
{
  int ret;
  printf("main()\n");
  printf("main():extvalue    = %d\n", extvalue);
  printf("main():extbssvalue = %d\n", extbssvalue);
  ret = extfunc(4);
  printf("main():extfunc()   = %d\n", ret);
  exit (0);
}

他にもmain

dlopen.c
#iclude <stdio.h>
#include <dlfcn.h>

int main()
{
  int ret;
  void *handle;
  int *extvalue_p;
  int *extbssvalue_p;
  int (*extfunc_p)(int a);

  handle = dlopen("./libsample.so", RTLD_LAZY);
  if (!handle) {
    fprintf(stderr, "cannot load library.\n");
    exit (1);
  }

  extvalue_p    = dlsym(handle, "extvalue");
  extbssvalue_p = dlsym(handle, "extbssvalue");
  extfunc_p     = dlsym(handle, "extfunc");
  if (!extvalue_p || !extbssvalue_p || !extfunc_p) {
    fprintf(stderr, "fail to find symbol.\n");
    exit (1);
  }

  printf("main()\n");
  printf("main():extvalue    = %d\n", *extvalue_p);
  printf("main():extbssvalue = %d\n", *extbssvalue_p);
  ret = extfunc_p(4);
  printf("main():extfunc()   = %d\n", ret);

  dlclose(handle);
  exit (0);
}

Makefile確認

 :	libsample.so libsample.a \
	sample_shared sample_static sample_shared.exec sample_static.exec \
	sample_shared.ldd \
	sample_pic.o.re libsample.so.1.re sample_shared.re \
	sample.o.re sample_static.re \
	sample_pic.o.ra libsample.so.1.ra sample_shared.ra sample_static.ra \
	libsample.so.1.got sample_shared.got \
	dlopen dlopen.exec

libsample.so :	sample.c
	echo "% gcc -fpic -c sample.c -o sample_pic.o -Wall" > libsample.so.comp
	gcc -fpic -c sample.c -o sample_pic.o -Wall >> libsample.so.comp 2>&1
	echo "% gcc -shared -Wl,-soname=libsample.so.1 sample_pic.o -o libsample.so.1" >> libsample.so.comp
	gcc -shared -Wl,-soname=libsample.so.1 sample_pic.o -o libsample.so.1 >> libsample.so.comp 2>&1
	echo "% ln -s libsample.so.1 libsample.so" >> libsample.so.comp
	ln -s libsample.so.1 libsample.so >> libsample.so.comp 2>&1
	echo "% " >> libsample.so.comp

sample_shared :	libsample.so libsample.a
	echo "% gcc -c main.c -Wall" > sample_shared.comp
	gcc -c main.c -Wall >> sample_shared.comp 2>&1
	echo "% gcc -Wl,-rpath=. main.o -L. -lsample -o sample_shared" >> sample_shared.comp
	gcc -Wl,-rpath=. main.o -L. -lsample -o sample_shared >> sample_shared.comp 2>&1
	echo "% " >> sample_shared.comp

sample_shared.exec :	sample_shared
	echo "% ./sample_shared" > sample_shared.exec
	./sample_shared >> sample_shared.exec 2>&1
	echo "% " >> sample_shared.exec

libsample.a :	sample.c
	echo "% gcc -c sample.c -Wall" > libsample.a.comp
	gcc -c sample.c -Wall >> libsample.a.comp 2>&1
	echo "% ar ruc libsample.a sample.o" >> libsample.a.comp
	ar ruc libsample.a sample.o >> libsample.a.comp 2>&1
	echo "% " >> libsample.a.comp

sample_static :	libsample.so libsample.a sample_shared
	echo "% gcc -static main.o -L. -lsample -o sample_static" > sample_static.comp
	gcc -static main.o -L. -lsample -o sample_static >> sample_static.comp 2>&1
	echo "% " >> sample_static.comp

sample_static.exec :	sample_static
	echo "% ./sample_static" > sample_static.exec
	./sample_static >> sample_static.exec 2>&1
	echo "% " >> sample_static.exec

sample_shared.ldd :	sample_shared
	echo "% ldd sample_shared" > sample_shared.ldd
	ldd sample_shared >> sample_shared.ldd 2>&1
	echo "% " >> sample_shared.ldd

sample_pic.o.re :	libsample.so
	echo "% readelf -a sample_pic.o" > sample_pic.o.re
	readelf -a sample_pic.o >> sample_pic.o.re
	echo "% " >> sample_pic.o.re

libsample.so.1.re :	libsample.so.1
	echo "% readelf -a libsample.so.1" > libsample.so.1.re
	readelf -a libsample.so.1 >> libsample.so.1.re
	echo "% " >> libsample.so.1.re

sample_shared.re :	sample_shared
	echo "% readelf -a sample_shared" > sample_shared.re
	readelf -a sample_shared >> sample_shared.re
	echo "% " >> sample_shared.re

sample.o.re :	sample.o
	echo "% readelf -a sample.o" > sample.o.re
	readelf -a sample.o >> sample.o.re
	echo "% " >> sample.o.re

sample_static.re :	sample_static
	echo "% readelf -a sample_static" > sample_static.re
	readelf -a sample_static >> sample_static.re
	echo "% " >> sample_static.re

sample_pic.o.ra :	sample_pic.o
	echo "objdump -d sample_pic.o" > sample_pic.o.ra
	objdump -d sample_pic.o | head -n 27 >> sample_pic.o.ra
	cat ../../rest.txt >> sample_pic.o.ra

libsample.so.1.ra :	libsample.so.1
	echo "% objdump -d libsample.so.1" > libsample.so.1.ra
	objdump -d libsample.so.1 | head -n 28 >> libsample.so.1.ra
	cat ../../rest.txt >> libsample.so.1.ra

sample_shared.ra :	sample_shared
	echo "% objdump -d sample_shared" > sample_shared.ra
	objdump -d sample_shared | head -n 31 >> sample_shared.ra
	cat ../../rest.txt >> sample_shared.ra

sample_static.ra :	sample_static
	echo "% objdump -d sample_static" > sample_static.ra
	objdump -d sample_static >> sample_static.ra
	echo "% " >> sample_static.ra

libsample.so.1.got :	libsample.so.1
	echo "% readelf -x 17 libsample.so.1" > libsample.so.1.got
	readelf -x 17 libsample.so.1 >> libsample.so.1.got
	echo "% " >> libsample.so.1.got

sample_shared.got :	sample_shared
	echo "% readelf -x 18 sample_shared" > sample_shared.got
	readelf -x 18 sample_shared >> sample_shared.got
	echo "% " >> sample_shared.got

dlopen :	dlopen.c
	echo "% gcc dlopen.c -o dlopen" > dlopen.comp
	gcc dlopen.c -o dlopen >> dlopen.comp 2>&1
	echo "% " >> dlopen.comp

dlopen.exec :	dlopen
	echo "% ./dlopen" > dlopen.exec
	./dlopen >> dlopen.exec 2>&1
	echo "% " >> dlopen.exec

clean :
	rm -f *.SO *.so *.so.? *.a *.o *.comp *.exec *.ldd *.re *.ra *.got \
		sample_shared sample_static dlopen

arコマンド

[iOS] 使用しているライブラリの情報を色々得るためのメモ
https://qiita.com/edo_m18/items/8df32fe9ea5416a77920

bash
$ man ar
AR(1)                       General Commands Manual                      AR(1)

NAME
     ar – create and maintain library archives

SYNOPSIS
     ar -d [-TLsv] archive file ...
     ar -m [-TLsv] archive file ...
     ar -m [-abiTLsv] position archive file ...
     ar -p [-TLsv] archive [file ...]
     ar -q [-cTLsv] archive file ...
     ar -r [-cuTLsv] archive file ...
     ar -r [-abciuTLsv] position archive file ...
     ar -t [-TLsv] archive [file ...]
     ar -x [-ouTLsv] archive [file ...]

DESCRIPTION
     The ar utility creates and maintains groups of files combined into an
     archive.  Once an archive has been created, new files can be added and
     existing files can be extracted, deleted, or replaced.

     Files are named in the archive by a single component, i.e., if a file
     referenced by a path containing a slash (``/'') is archived it will be
 named by the last component of that path.  When matching paths listed on
     the command line against file names stored in the archive, only the last
     component of the path will be compared.

     All informational and error messages use the path listed on the command
     line, if any was specified, otherwise the name in the archive is used.
     If multiple files in the archive have the same name, and paths are listed
     on the command line to ``select'' archive files for an operation, only
     the first file with a matching name will be selected.

     The normal use of ar is for the creation and maintenance of libraries
     suitable for use with the loader (see ld(1)) although it is not
     restricted to this purpose.  The options are as follows:

     -a      A positioning modifier used with the options -r and -m.  The
             files are entered or moved after the archive member position,
             which must be specified.

     -b      A positioning modifier used with the options -r and -m.  The
             files are entered or moved before the archive member position,
             which must be specified.

     -c      Whenever an archive is created, an informational message to that
             effect is written to standard error.  If the -c option is
             specified, ar creates the archive silently.
    -d      Delete the specified archive files.

     -i      Identical to the -b option.

     -m      Move the specified archive files within the archive.  If one of
             the options -a, -b or -i are specified, the files are moved
             before or after the position file in the archive.  If none of
             those options are specified, the files are moved to the end of
             the archive.

     -o      Set the access and modification times of extracted files to the
             modification time of the file when it was entered into the
             archive.  This will fail if the user is not the owner of the
             extracted file or the super-user.

     -p      Write the contents of the specified archive files to the standard
             output.  If no files are specified, the contents of all the files
             in the archive are written in the order they appear in the
             archive.

     -q      (Quickly) append the specified files to the archive.  If the
             archive does not exist a new archive file is created.  Much
             faster than the -r option, when creating a large archive piece-
             by-piece, as no checking is done to see if the files already
             exist in the archive.

     -r      Replace or add the specified files to the archive.  If the
             archive does not exist a new archive file is created.  Files that
             replace existing files do not change the order of the files
             within the archive.  New files are appended to the archive unless
             one of the options -a, -b or -i is specified.

     -T      Select and/or name archive members using only the first fifteen
             characters of the archive member or command line file name.  The
             historic archive format had sixteen bytes for the name, but some
             historic archiver and loader implementations were unable to
 handle names that used the entire space.  This means that file
             names that are not unique in their first fifteen characters can
             subsequently be confused.  A warning message is printed to the
             standard error output if any file names are truncated.  (See
             ar(5) for more information.)

     -L      Used the extended format to allow long archive member names.
             This is the default.

     -s      Write an object-file index into the archive, or update an
             existing one, even if no other change is made to the archive.
             You may use this modifier flag either with any operation, or
             alone.  Running `ar s' on an archive is equivalent to running
             `ranlib' on it.

     -S      Do not generate an archive symbol table.  This can speed up
             building a large library in several steps.  The resulting archive
             can not be used with the linker.  In order to build a symbol
             table, you must omit the S modifier on the last execution of ar,
             or you must run ranlib on the archive.

     -t      List the specified files in the order in which they appear in the
             archive, each on a separate line.  If no files are specified, all
             files in the archive are listed.

     -u      Update files.  When used with the -r option, files in the archive
             will be replaced only if the disk file has a newer modification
             time than the file in the archive.  When used with the -x option,
             files in the archive will be extracted only if the archive file
             has a newer modification time than the file on disk.

     -v      Provide verbose output.  When used with the -d, -m, -q or -x
             options, ar gives a file-by-file description of the archive
             modification.  This description consists of three, white-space
             separated fields: the option letter, a dash (``-'') and the file
             name.  When used with the -r option, ar displays the description
as above, but the initial letter is an ``a'' if the file is added
             to the archive and an ``r'' if the file replaces a file already
             in the archive.

             When used with the -p option, the name of each printed file is
             written to the standard output before the contents of the file,
             preceded by a single newline character, and followed by two
             newline characters, enclosed in less-than (``<'') and greater-
             than (``>'') characters.

             When used with the -t option, ar displays an ``ls -l'' style
             listing of information about the members of the archive.  This
             listing consists of eight, white-space separated fields: the file
             permissions (see strmode(3) ), the decimal user and group ID's,
             separated by a single slash (``/''), the file size (in bytes),
             the file modification time (in the date(1) format ``%b %e %H:%M
             %Y''), and the name of the file.

     -x      Extract the specified archive members into the files named by the
             command line arguments.  If no members are specified, all the
             members of the archive are extracted into the current directory.

             If the file does not exist, it is created; if it does exist, the
             owner and group will be unchanged.  The file access and
             modification times are the time of the extraction (but see the -o
             option).  The file permissions will be set to those of the file
             when it was entered into the archive; this will fail if the user
             is not the owner of the extracted file or the super-user.

     The ar utility exits 0 on success, and >0 if an error occurs.

ENVIRONMENT
     TMPDIR  The pathname of the directory to use when creating temporary
             files.
FILES
     /tmp    default temporary file directory
     ar.XXXXXX
             temporary file names

COMPATIBILITY
     By default, ar writes archives that may be incompatible with historic
     archives, as the format used for storing archive members with names
     longer than fifteen characters has changed.  This implementation of ar is
     backward compatible with previous versions of ar in that it can read and
     write (using the -T option) historic archives.  The -T option is provided
     for compatibility only, and will be deleted in a future release.  See
     ar(5) for more information.

STANDARDS
     The ar utility is expected to offer a superset of the IEEE Std 1003.2
     (“POSIX.2”) functionality.

SEE ALSO
     ld(1), ranlib(1), strmode(3), ar(5)

関連資料

' @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

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

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

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

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

数学関連記事100
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

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

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

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

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

日本語(0)一欄
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

鉄道(0)鉄道のシステム考察はてっちゃんがてつだってくれる
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を含む)システムの課題、官(0)
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

自動制御、制御工学一覧(0)
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 初稿  20240714

最後までおよみいただきありがとう4ざいました。

いいね 💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚 and follow me for your happy life.

0
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
0
0