gpt4 book ai didi

mysql - 意外的函数调用

转载 作者:可可西里 更新时间:2023-11-01 08:52:23 25 4
gpt4 key购买 nike

我正在使用 MySQL 5.0.51a,我发现了一个错误,该错误会在我的程序退出时导致无限循环(以堆栈溢出和 seqgfault 结束)。

我发现如果我有一个名为 shutdown() 的函数,它会在调用 mysql_close() 期间被调用。

我在下面包含了一个最小示例 C 源文件和 makefile 以显示实际问题。在该示例中,尽管 main() 未调用 shutdown(),但仍被调用。

这是怎么回事?我的 shutdown() 是否与 libmysqlclient 中的 shutdown() 冲突?如果是这样,是否有 gcc 不知道的原因?

我正在使用 gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)


mysql_shutdown.c:

#include <stdio.h>
#include <mysql/mysql.h>

#define HOST "<hostname>"
#define USER "<username>"
#define PASSWD "<password>"
#define DB "<dbname>"

MYSQL *connection;

void shutdown(void)
{
printf("shutdown called\n");
}

int main()
{
connection = mysql_init(NULL);
mysql_real_connect(connection, HOST, USER, PASSWD, DB, 0, NULL, 0);
mysql_close(connection);

return 0;
}

生成文件:

mysql_shutdown: mysql_shutdown.c
gcc -Wall -Wextra -Werror `mysql_config --cflags` -o $@ $^ `mysql_config --libs`

输出:

$ ./mysql_shutdown
shutdown called

请注意,这似乎与 GCC function name conflict 中显示的行为相反.在那种情况下,预期的函数没有被调用,而在我的例子中,一个函数在不期望的时候被调用。

最佳答案

最有可能发生的情况是,因为 mysql_config --libs 为您提供了 MySQL 库文件的列表,而 shutdown() 函数位于 库中的不同目标文件,它没有被购买。

您必须了解大多数链接器的工作方式。他们将做的是将您明确列出的所有目标文件捆绑在一起,最终得到一个部分可执行文件和一个尚未解析的符号列表。

然后搜索库以解析这些符号,方法是在那些可以解析符号的库中找到目标文件。通常情况下,您会在其中一个库中找到 mysql_close() 并从该库加载其对象文件。但该操作可能会引入更多需要解析的符号,这反过来会导致搜索更多库。

例如,假设 mysql_close() 调用 shutdown(),这通常在 MySQL 库之一中提供。但是,因为您已经定义了它,mysql_close() 的加载不会导致 Unresolved 关闭符号。因此无需在任何图书馆中寻找它。

确实导致 mysql_close() 调用完全不同的 shutdown(),即您在代码中提供的那个。

关于mysql - 意外的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11452784/

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