assembly C++无法访问程序集中声明的全局变量

0vvn1miw  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(89)

系统:Centos
我有一个C文件,一个汇编文件和一个GYP文件:
C
文件:src/node_main.cc

#include <iostream>
using namespace std;
extern "C" {
extern char __attribute__((weak)) global_variable;
}  // extern "C"

int main()
{

    printf("global_variable:%p", reinterpret_cast<uintptr_t>(&global_variable));
    return 0;
}

字符串
装配文件:src/global_variable.S

.global global_variable

global_variable:


GYP文件:node.gyp

{
    'targets': [
        {
            'target_name': 'global_variable',
            'type': 'none',
            'conditions': [
                [ 'OS in "linux freebsd solaris"', {
                  'type': 'static_library',
                  'sources': [
                    'src/global_variable.S'
                  ]
                }],
            ]
        },
        {
            'target_name': 'myexperiment',
            'type': 'executable',
            'sources': [
                'src/node_main.cc'
            ],
            'dependencies': [ 'global_variable' ],
            'conditions': [
                [ 'OS in "linux freebsd"', {
                  'dependencies': [ 'global_variable' ],
                #   'ldflags+': [
                #     '<(PRODUCT_DIR)/obj.target/global_variable/src/global_variable.o'
                #   ]
                }]
            ]
        }
    ]
}


我的生成命令:

python3 main.py
make


我的问题是:当我注解掉“ldflags+”时,我无法访问“global_variable”:

./out/Default/myexperiment


执行“myexperiment”将打印“global_variable:(nil)"。
当我使用“ldflags”时,我可以访问“global_variable”,它将打印“global_variable:0x 4006 e6”。
我使用“make -n”命令,并尝试使用“ldflags+"查看g++发生了什么:

g++ -o out/Default/myexperiment out/Default/obj.target/global_variable/src/global_variable.o  -Wl,--start-group out/Default/obj.target/myexperiment/src/node_main.o out/Default/obj.target/libglobal_variable.a  -Wl,--end-group


不使用“ldflags+":

g++ -o out/Default/myexperiment   -Wl,--start-group out/Default/obj.target/myexperiment/src/node_main.o out/Default/obj.target/libglobal_variable.a  -Wl,--end-group


似乎唯一的区别是:“global_variable.o”。
如果添加了“global_variable.o”,则可以访问全局变量,否则全局变量为nil,尽管两者都添加了“libglobal_variable. a”。
完全糊涂了。

ajsxfq5m

ajsxfq5m1#

今天我做了很多实验,花了两天时间才弄明白。
终于找到了钥匙:第一个月
weak与静态库一起使用时,链接器将不会尝试从静态库中查找定义,因此该定义将被丢弃。
当与目标文件链接时,链接器将无条件地将其链接到输出文件。
所以它与汇编程序和GYP无关。这是因为我没有完全理解.a文件如何与链接器一起工作。
这个答案对我帮助很大:https://stackoverflow.com/questions/51656838/attribute-weak-and-static-libraries#:~:text= The%20weak%20attribute%20causes%20the,targets%2C%20and%20also%20for%20a.
谢谢大家!

相关问题