Переменная исчезает в двоичном файле, который доступен в статической lib - PullRequest
1 голос
/ 07 октября 2010

У меня есть упомянутая проблема.Я создаю объект внутри статической библиотеки, он появляется, когда я запускаю nm в статической библиотеке, но когда я связываю библиотеку с двоичным файлом и запускаю nm, она исчезает.Я знаю, что эта проблема уже задавалась, но я не смог найти никаких ответов.Для меня важно иметь возможность сохранить эту переменную в двоичном файле, потому что мы пытаемся реализовать проверки версий для статических библиотек в двоичном файле.Пожалуйста помоги.Спасибо.Пример кода следующий:

test.h

#ifndef TEST_H
#define TEST_H

class Test
{   
    public:
        Test();
};

extern Test* gpTest;

#endif

test.cpp

#include "test.h"

Test::Test()
{
    gpTest = this;
}   

Test test;

main.cpp

#include "test.h"
#include <iostream>

using namespace std;

Test* gpTest = NULL;

int main()
{
    return 0;
}

BUILD

g++ -c test.cpp -o test.o
ar cr test.a test.o
g++ main.cpp -o app -L/home/duminda/intest/test.a

nm -C test.a

0000000000000054 t global constructors keyed to _ZN4TestC2Ev
000000000000002b t __static_initialization_and_destruction_0(int, int)
0000000000000016 T Test::Test()
0000000000000000 T Test::Test()
                 U __gxx_personality_v0
                 U gpTest
0000000000000000 B test

nm -C app

0000000000600e10 d _DYNAMIC
0000000000600fe8 d _GLOBAL_OFFSET_TABLE_
0000000000400754 t global constructors keyed to gpTest
0000000000400858 R _IO_stdin_used
                 w _Jv_RegisterClasses
0000000000400717 t __static_initialization_and_destruction_0(int, int)
                 U std::ios_base::Init::Init()@@GLIBCXX_3.4
                 U std::ios_base::Init::~Init()@@GLIBCXX_3.4
0000000000601050 b std::__ioinit
0000000000600df0 d __CTOR_END__
0000000000600de0 d __CTOR_LIST__
0000000000600e00 D __DTOR_END__
0000000000600df8 d __DTOR_LIST__
0000000000400968 r __FRAME_END__
0000000000600e08 d __JCR_END__
0000000000600e08 d __JCR_LIST__
0000000000601038 A __bss_start
                 U __cxa_atexit@@GLIBC_2.2.5
0000000000601028 D __data_start
0000000000400810 t __do_global_ctors_aux
0000000000400670 t __do_global_dtors_aux
0000000000601030 D __dso_handle
                 w __gmon_start__
                 U __gxx_personality_v0@@CXXABI_1.3
0000000000600ddc d __init_array_end
0000000000600ddc d __init_array_start
0000000000400770 T __libc_csu_fini
0000000000400780 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
0000000000601038 A _edata
0000000000601058 A _end
0000000000400848 T _fini
00000000004005a0 T _init
0000000000400620 T _start
000000000040064c t call_gmon_start
0000000000601038 b completed.6096
0000000000601028 W data_start
0000000000601040 b dtor_idx.6098
00000000004006e0 t frame_dummy
0000000000601048 B gpTest
000000000040070c T main

Ответы [ 3 ]

2 голосов
/ 07 октября 2010

Если ничто в программе не ссылается на объектный файл из библиотеки, то у компоновщика нет причин включать этот объектный файл в исполняемый файл.Компоновщик предназначен для выбора только тех частей из библиотеки, которые необходимы для разрешения открытых зависимостей.

При использовании статической компоновки доступны только следующие параметры:

  1. Не использовать библиотеки, но передайте все соответствующие объектные файлы явно компоновщику
  2. Убедитесь, что хотя бы один из объектных файлов из приложения зависит от соответствующего объектного файла из библиотеки.

Возможно, здесь может помочь динамическое связывание, но я точно не знаю.

1 голос
/ 07 октября 2010

оптимизирующий компилятор / компоновщик - вы не используете gpTest в main (), поэтому он не добавляется в код. Если вы поместите ссылку / использование в функцию main (), она появится снова.

0 голосов
/ 08 октября 2010

Я нашел то, что искал: D. Кажется, что флаг компоновщика --whole-archive существует для того, чтобы убедиться, что все символы в статической библиотеке независимо от того, к ним обращается приложение или нет, попадают в приложение. Хотя мне все еще трудно заставить это работать, я думаю, что я на правильном пути.

...