スポンサーリンク

このドキュメントの内容は、以下の通りです。

C言語で共有ライブラリを動的ロードする方法


FreeBSDやLinuxなどのUNIXで共有ライブラリを動的にロードするには、
dlopen()を利用します。

共有ライブラリのサンプル

#include <stdio.h>

int
hello (int i)
{
	printf ("Hello, %d\n", i);
	return (i + 1);
}

共有ライブラリのコンパイル

gcc -shared hello.c -o hello.so

共有ライブラリをロードするプログラム


1. dlopen()で共有ライブラリ hello.so をロードします。
2. dlsym()で共有ライブラリのhello()関数のポインタを取得します。
3. dlsymで得た関数ポインタを利用して、実行します。
4. 不要になった共有ライブラリは、dlclose()で閉じます。

dl*系のAPIでエラーが発生した場合には、dlerror()でエラーメッセージを取得することが可能です。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>

int
main(int argc, char *argv[], char *environ[])
{
	void	*h;
	int	(*f) (int);
	
	h = dlopen ("./hello.so", RTLD_LAZY);
	if (h == NULL)
	{
		fprintf (stderr, "%s", dlerror() );
		exit (EXIT_FAILURE);
	}

	f = dlsym (h, "hello");

	if (f == NULL)
	{
		fprintf (stderr, "%s\n", dlerror() );
		exit (EXIT_FAILURE);
	}

	printf ("%d\n", (f) (200));
	dlclose (h);

	exit (EXIT_SUCCESS);
}

共有ライブラリをロードするプログラムのビルド

gcc main.c

実行

Hello, 200
201

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー