gpt4 book ai didi

c - PGD​​LLIMPORT 和 PostgreSQL C 钩子(Hook)

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:42 26 4
gpt4 key购买 nike

我已经使用 PostgreSQL 钩子(Hook)有一段时间了,昨天我想尝试添加我自己的钩子(Hook)来测试一些东西(为了好玩)。

所以我查看了 ExecutorStart_hook 以了解我需要做些什么才能让我自己的 hook 进入 PostgreSQL。

execMain.c 中非常简单,首先定义钩子(Hook)

ExecutorStart_hook_type ExecutorStart_hook = NULL;

然后在 ExecutorStart(...); 中使用它。

executor.h中我们首先定义了钩子(Hook)类型,然后我们导入钩子(Hook)变量。

typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);
extern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;

从哪里导入这个钩子(Hook)变量?除了 execMain.c 之外,我在其他任何地方都看不到它,而且我在那里也没有看到 PGDLLEXPORT

最佳答案

在非 Windows 平台上,它什么都不做。

在 Windows 上,PGDLLIMPORT 的含义根据 PostgreSQL 服务器是否正在编译或扩展而变化。 header 是从扩展的角度编写的,这就是它说 PGDLLIMPORT 的原因。

如果您查看 src/include/port/win32.hPGDLLIMPORT 的定义:

#ifdef BUILDING_DLL
#define PGDLLIMPORT __declspec (dllexport)
#else /* not BUILDING_DLL */
#define PGDLLIMPORT __declspec (dllimport)
#endif

...您会看到,如果设置了 BUILDING_DLL,我们将其扩展为 __declspec(ddlexport)。所以它从服务器二进制文件导出符号。我们只在编译postgres.exe时设置了BUILDING_DLL;它的名字有点不幸。之所以如此,是因为在 Windows 上,您通常从 DLL 导出符号以供应用程序使用,而不是像在 postgres 中那样反过来。

如果未设置 BUILDING_DLL,我们将 PGDLLIMPORT 定义为 __declspec(dllimport),将符号从服务器二进制文件导入任何链接到

所以...当 postgres 包含 executor.h 时,它导出 符号。当您在扩展 DLL 项目中包含 executor.h 时,它会导入该符号。

因为 how DLL linkage works on win32/PE 所有这一切都是必要的.在 ELF 平台(Linux、BSD 等)和 Mach-O (Mac OS X) 上,这些都不是必需的。

关于c - PGD​​LLIMPORT 和 PostgreSQL C 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43804054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com