2013年2月24日日曜日

[C]Shared library 内の関数呼び出し優先度

メイン関数
Example: test.c
#include <stdio.h>
#include <dlfcn.h>
void func(void);

int main(void)
{
  void *lib;
  void (*func)();

  printf("%s @ %s:%d\n", __FUNCTION__, __FILE__, __LINE__);

  lib = dlopen("./sharedlib.so", RTLD_LAZY);
  func = dlsym(lib, "func");

  func();

  return 0;
}

void func(void)
{
  printf("%s @ %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
}

void func2(void)
{
  printf("%s @ %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
}
Shared library ソース
Example: sharedlib.c
#include <stdio.h>

void func2(void);

void func(void)
{
  printf("%s @ %s:%d\n", __FUNCTION__, __FILE__, __LINE__);

  func2();
}

void func2(void)
{
  printf("%s @ %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
}
Example: Makefile
CC = gcc

default: test sharedlib.so

test: test.o
  $(CC) -o test test.o -ldl

test.o: test.c
  $(CC) -c test.c

sharedlib.o: sharedlib.c
  $(CC) -fPIC -c sharedlib.c

sharedlib.so: sharedlib.o
  $(CC) -shared sharedlib.o -o sharedlib.so

clean:
  rm -rf *.o
  rm -rf *.so
  rm -rf test
このプログラムをコンパイルして実行すると以下のように test にある func, func2 は実行されず、sharedlib.c にある func, func2 が上書きされて実行される
$ ./test
main @ test.c:10
func @ sharedlib.c:7
func2 @ sharedlib.c:14

0 件のコメント:

コメントを投稿