サンプルコードを確認してください。
#include <string.h>
char* strcpy(char* dest, const char* src);
int main ()
{
char str1[] = "Geeks";
char str2[] = "Quiz";
puts("str1 before memcpy ");
puts(str1);
/* Copies contents of str2 to sr1 */
strcpy (str1, str2);
puts("\nstr1 after memcpy ");
puts(str1);
return 0;
}
char* strcpy(char* dest, const char* src){
*dest = '1';
}
このタイプがリンカーライブラリによってオーバーライドされないようにする方法。
Cコードに名前空間を付けます。
私はすべてのグローバル(1つでもstatic
実行可能ファイルでも)にライブラリのプレフィックスを付けます。これにより、libcとの名前の衝突は問題になりません(コードの移動、コードの統合、または以前のstatic
関数の作成も簡素化されますextern
)。
一般に、ライブラリをリンクするCプログラムの作成者が、ライブラリの機能(プログラム、ルール)に介入するのを止めることはできません。ただし、Linuxなどのプラットフォームで共有ライブラリの作成者である場合は、ライブラリの内部関数をリンカベースで簡単にオーバーライドできないようにすることができます。これを行う1つの方法は、ライブラリプライベート(非表示)シンボルエイリアスを使用することです。
例(非標準のC拡張機能と、静的ライブラリではなく共有ライブラリの使用に依存しています):
#!/bin/sh -eu
cat > h.h<<EOF
void a(void);
void A(void);
void b(void);
EOF
cat > mylib.c <<EOF
#include <stdio.h>
#include "h.h"
void b_(void);
void a()
{
b(); //overridable
}
void A(void)
{
b_(); //non-overridable
}
void b(void)
{
puts("b");
}
__attribute((visibility("hidden"),alias("b"))) typeof(b) b_ ;
//^ the b_ hidden function (unlike a static function)
//can be used from other translation units of the same shared lib
//but not from outside
EOF
gcc -c mylib.c -fpic
gcc mylib.o -o libmylib.so -shared
cat > main.c <<EOF
#include "h.h"
#include <stdio.h>
void b(void) { puts("my b"); }
int main()
{
puts("do a"); a(); puts("===");
puts("do b"); b(); puts("===");
puts("do A"); A(); puts("===");
}
EOF
gcc main.c $PWD/libmylib.so
./a.out
出力:
do a
my b
===
do b
my b
===
do A
b
===
詳細については、たとえば、U。Drepperによる共有ライブラリの作成方法を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加