【问题标题】:the result of linking two strong function symbol with the same function signature use g++ and why?链接两个具有相同函数签名的强函数符号的结果使用 g++,为什么?
【发布时间】:2013-10-15 08:33:51
【问题描述】:

链接两个相同的函数符号时,我对链接过程感到困惑。

point.h:

#ifndef _POINT_H_
#define _POINT_H_

struct dpoint_t
{
    /* data */
    double x, y;
};

struct ipoint_t
{
    /* data */
    int x, y;
};

#ifdef DOUBLE_POINT
    typedef struct dpoint_t data;
#else
    typedef struct ipoint_t data;
#endif

struct Point
{
    data p;
    int idx;
};
/*
#ifndef DOUBLE_POINT
__attribute__ ((weak)) 
#endif
*/
void * get_y(struct Point &x);

#endif

point.cpp:

#include "point.h"


void * get_y(struct Point &pt)
{
    int a = 1;
    return &(pt.p.y);
}

test.cpp:

#include <stdio.h>
#include "point.h"

int main()
{
    struct Point x;
    x.p.x = 10.0;
    x.p.y = 5.0;
    void *p = get_y(x);
    printf("double: %lf\nint: %d\n", *(double *)p, *(int *)p);
    return 0;
}

我得到两个对象

g++ -o double_point -DDOUBLE_POINT -c point.cpp
g++ -o int_point -c point.cpp

并让我们使用 g++ 将它们与 test.cpp 链接在一起

我的问题是:

为什么我可以成功链接它们,我的意思是有 2 个相同的符号,为什么 ld 没有出错

我想如果我在其中一个函数上使用弱符号,链接结果将永远是强函数符号,但结果不会改变,总是先出现的符号,我想知道为什么

我的编译器:

GNU C++ 版本 3.4.5 20051201 (Red Hat 3.4.5-2) (x86_64-redhat-linux) 由 GNU C 版本 3.4.5 20051201 (Red Hat 3.4.5-2) 编译。

GNU 汇编器版本 2.15.92.0.2 (x86_64-redhat-linux) 使用 BFD 版本 2.15.92.0.2 20040927

【问题讨论】:

  • 你是说参数ptx在功能上不一样get_y??

标签: c++ linux gcc compiler-construction symbols


【解决方案1】:
【解决方案2】:

您违反了单一定义规则,因此导致了未定义的行为。虽然我理解您可能想要做什么,但事实是您的代码是错误的,编译器工具链不需要提供任何特定行为。

您想要解决的真正问题是什么?因为这显然不是解决问题的方法。

【讨论】:

  • Rodriguez:我不是试图解决问题,只是想弄清楚这些概念。我阅读了 ODR,仍然有疑问:如果在一个对象中符号是弱符号,为什么链接的结果并不总是强符号
  • @zuanyg:这与语言无关,但与您使用的特定链接器无关。从语言的角度来看,您的程序格式不正确,不需要诊断并且任何事情都可能发生。我不熟悉标准制裁之外的链接器的用法,所以我不能进一步评论。阅读链接器的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2021-07-30
  • 1970-01-01
  • 2023-03-22
  • 2019-04-09
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多