C,静态库,链接器:如何在弱符号

时间:2016-02-12 06:37:33

标签: c gcc linker static-libraries

我在目标文件中有一个强符号,在静态库中有一个弱符号。

如果我编译时没有将目标文件放在另一个库中,则选择强符号。

gcc q_htb.o -lresolv -L. -lasntc -lnetlink -lutil -L. -lm -o tc

此处q_htb.o包含强符号htb_qdisc_uti,而libasntc库包含弱符号。

 nm tc | grep htb_qdisc_util
0000000000615960 D htb_qdisc_util

现在,如果我将q_htb.o目标文件放在静态库libhtb中,则优先选择弱符号

gcc -lresolv -L. -lasntc -lhtb -lnetlink -lutil -L. -lm -o tc
nm tc | grep htb_qdisc_util
                 w htb_qdisc_util

如上所示,htb_qdisc_util很弱。我需要在静态库中使用q_htb.o,如何选择强符号?

注意:更改库的顺序没有帮助。

编辑:

q_htb.o中的强符号定义,仅包含q_htb.c

struct qdisc_util htb_qdisc_util = {
    .id         = "htb",
    .parse_qopt = htb_parse_opt,
    .print_qopt = htb_print_opt,
    .print_xstats   = htb_print_xstats,
    .parse_copt = htb_parse_class_opt,
    .print_copt = htb_print_opt,
};

libasntc.a中的弱符号

 extern char htb_qdisc_util[] __attribute__((weak)); if (!strcmp(sym, "htb_qdisc_util")) return htb_qdisc_util;

1 个答案:

答案 0 :(得分:0)

库中的文件(即q_htb.o)要么完全添加,要么根本不添加。因此,如果弱符号可以在没有其他符号的.o文件中,则不会将其拉入