[Armadillo:07553] 自作共有ライブラリをatmark-distに組み込むには? (was: clock_gettime()の参照解決)

Takenoshita Koyo email@hidden
2011年 9月 7日 (水) 19:52:28 JST


竹之下です。
※話が変わりましたので、タイトルを変えました

> 以下のことをatmark-dist上で実現する方法をお教えください。
> おそらくあまり難しくないのだとは思いますが、わからないのです。
> 
> ・共有ライブラリ(*.so)を自前で作成する
> ・作成した共有ライブラリを動的リンクする
> ・自作の共有ライブラリをromfs.imgに組み込む
> 
> 上記をATDE3の/home/atmark/atmark-distで
> 一度makeするだけで全て行えるようにしたいところです。

確かに、自前で共有ライブラリを作成したい場合にどうしたらよいかは、
どこにも書いていないかもしれませんね。

Armadillo開発ガイド[1]では、自前のアプリケーションプログラムを追加
する方法として、プロダクトディレクトリだけを変更する方法を紹介しています。
これと同様の考え方で、自前の共有ライブラリも追加することができます。

Armadillo開発ガイドの例[2]と同じように、自分用のプロダクトディレクトリを
atmark-dist/vendors/AtmarkTechno/my-product として作ったとして、
共有ライブラリに関連するディレクトリ構成を以下のようにします。

atmark-dist/vendors/AtmarkTechno/my-product         : 自分用のプロダクトディレクトリ
atmark-dist/vendors/AtmarkTechno/my-product/my-prog : 自前のアプリケーションプログラム用ディレクトリ
atmark-dist/vendors/AtmarkTechno/my-product/lib     : 自前の共有ライブラリ用ディレクトリ
atmark-dist/vendors/AtmarkTechno/my-product/include : 自前の共有ライブラリのヘッダファイル用ディレクトリ

atmark-dist/vendors/AtmarkTechno/my-product/Makefileは、
以下のように lib と my-prog がビルド対象になるように変更します。

--- a/vendors/AtmarkTechno/my-product/Makefile
+++ b/vendors/AtmarkTechno/my-product/Makefile
@@ -16,7 +16,8 @@ comma := ,
 empty :=
 space := $(empty) $(empty)
 
-SUBDIR_y =
+SUBDIR_y = lib/
+SUBDIR_y += my-prog/
 SUBDIR_$(CONFIG_VENDOR_FUNCTESTER_FUNCTESTER)  += functester/
 SUBDIR_$(CONFIG_VENDOR_GPIOCTRL_GPIOCTRL)      += gpioctrl/
 SUBDIR_$(CONFIG_VENDOR_LEDCTRL_LEDCTRL)                += ledctrl/

自前の共有ライブラリディレクトリには、Makefileと共有ライブラリのソースコードを
置きます。共有ライブラリの名前は、とりあえず libsomething.so としておきます。

共有ライブラリ用のMakefileは以下のようにします。
コンパイルするときには、"-fPIC"(Position Independent Code)オプションをつけます[3]。
また、リンクするときには、"-shared -Wl,-soname," オプションをつけます[4]。
共有ライブラリの実体は、libsomething.so.0.0.0という名前のファイルになります。
共有ライブラリの命名規則[5]に基づいて、libsomething.so.0.0.0 から libsomething.so.0 に、
libsomething.so.0 から libsomething.so にシンボリックリンクを貼ります。
これらのファイルは、Armadillo の /usr/lib にインストールします。

=== atmark-dist/vendors/AtmarkTechno/my-product/lib/Makefile ここから ===
VERSION=0
MINOR=0
RELEASE=0

LINKERNAME = libsomething.so
SONAME = $(LINKERNAME).$(VERSION)
REALNAME = $(SONAME).$(MINOR).$(RELEASE)

all: $(LINKERNAME)

$(LINKERNAME): $(SONAME)
	ln -sf $(SONAME) $(LINKERNAME)

$(SONAME): $(REALNAME)
	ln -sf $(REALNAME) $(SONAME)

$(REALNAME): libsomething.o
	$(CC) -shared -Wl,-soname,$(SONAME) $^ -o $(REALNAME)

clean:
	$(RM) *~ *.o $(REALNAME)

romfs:
	$(ROMFSINST) /usr/lib/$(REALNAME)
	$(ROMFSINST) -s /usr/lib/$(REALNAME) /usr/lib/$(SONAME)
	$(ROMFSINST) -s /usr/lib/$(SONAME) /usr/lib/$(LINKERNAME)

%.o: %.c
	$(CC) $(CFLAGS) -c -fPIC -o $@ $<
=== atmark-dist/vendors/AtmarkTechno/my-product/lib/Makefile ここまで ===

libsomething.so のソースコードは、libsomething.c というファイル名で作成します。
適当に、do_something()という関数を公開することにします。

=== atmark-dist/vendors/AtmarkTechno/my-product/lib/libsomething.c ここから ===
int do_something(int i) {
	return i + 1;
}
=== atmark-dist/vendors/AtmarkTechno/my-product/lib/libsomething.c ここまで ===

自作のアプリケーションプログラムのソースコードは my-prog ディレクトリ以下に置きたい
のですが、do_something()関数のプロトタイプをどこかに書いておかなければなりません。
アプリケーションプログラムのソースコード中に書いてもいいのですが、
せっかくの共有ライブラリですので、複数のアプリケーションプログラムで使われることを
想定して、別途ヘッダファイル用のディレクトリを用意することにします。

=== atmark-dist/vendors/AtmarkTechno/my-product/include/something.h ここから ===
#if !defined(SOMETHING_H)
#define SOMETHING_H

int do_something(int i);

#endif /* !defined(SOMETHING_H) */
=== atmark-dist/vendors/AtmarkTechno/my-product/include/something.h ここまで ===

自作アプリケーションプログラム用のMakefileは、libsomething.soとsomething.h
が参照できるように書いてあげればよいです。

"-L"オプションで、共有ライブラリがあるディレクトリを指定します。リンクする共有ライブラリは、
"-l"オプションで指定します。どの共有ライブラリを使用するかという情報は、リンクするときに
分かれば良いので、LDFLAGSに追加します。

ヘッダファイルがあるディレクトリは、"-I"オプションで指定します。ヘッダファイルは、
コンパイルするときに必要なので、CFLAGSに指定します。

=== atmark-dist/vendors/AtmarkTechno/my-product/my-prog/Makefile ここから ===
LDFLAGS = -L../lib -lsomething
CFLAGS += -I../include

TARGET = my-prog

all: $(TARGET)

my-prog: my-prog.o
	$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean:
	$(RM) *~ *.o $(TARGET)

romfs:
	$(ROMFSINST) /bin/$(TARGET)

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<
=== atmark-dist/vendors/AtmarkTechno/my-product/my-prog/Makefile ここまで ===

自前アプリケーションプログラムのソースコードは、my-prog.cという名前にします。
ヘッダファイルのディレクトリを"-I"オプションで指定しているので、#include ""ではなく
#include <> で something.h を指定できます。

また、リンク時に"-lsomething"を指定しているので、共有ライブラリlibsomething.soに
実体のあるdo_something()関数を呼び出せるようになります。

=== atmark-dist/vendors/AtmarkTechno/my-product/my-prog/my-prog.c ここから ===
#include <stdio.h>
#include <something.h>

int main(int argc, char *argv[]) {
	printf("call do_something(10) = %d\n", do_something(10));

	return 0;
}
=== atmark-dist/vendors/AtmarkTechno/my-product/my-prog/my-prog.c ここまで ===

[1]:http://armadillo.atmark-techno.com/armadillo-guide
[2]:http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2.1.0/ch07.html#sec_add_orginal_product
[3]:http://0xcc.net/blog/archives/000107.html
[4]:http://linuxjf.sourceforge.jp/JFdocs/Program-Library-HOWTO/shared-libraries.html#AEN132
[5]:http://linuxjf.sourceforge.jp/JFdocs/Program-Library-HOWTO/shared-libraries.html#AEN55

-- 
Koyo Takenoshita




armadillo メーリングリストの案内