AIX / xlclang ++: переменные thread_local дают ошибку компоновщика: неопределенные символы - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь построить общий объект (.so) в AIX, используя компилятор IBM xlclang ++ (v16.1)..So использует параллелизм C ++ 11, и я определил некоторые глобальные переменные как thread_local .Компоновщик дает неопределенный символ ошибки для этих переменных (и для другого символа: .__ pt_atexit_np ).

Есть также некоторые thread_local static переменныевнутри функции.(См. DoSomething ниже.) Компоновщик не жалуется на это, но вышеупомянутый символ .__ pt_atexit_np может иметь к этому отношение.

Этот код компилируется, ссылки и отлично работает в Windows (как DLL), как при использовании MS Visual C ++ 2019 и clang ++ (v9.0.0).

Чтобы включить многопоточный код в AIX (я надеялся), я добавил компилятор/ linker options -qthreaded и -qtls = global-dynamic .

// --- In GlobData.h: ---
extern thread_local bool GLOB_bTracingEnabled;
// --- In GlobData.cpp: --- (Error: Undefined symbol)
thread_local bool GLOB_bTracingEnabled;
// --- In Calculations.cpp: --- (Error?)
int DoSomething() {
    thread_local static int _staticVar;
    // ...
}
#--- In makefile: ---
INCL1=.
CCC=/opt/IBM/xlC/16.1.0/bin/xlclang++
CCFLAGS1=-q64 -qrtti -qthreaded -qtls=global-dynamic -qmkshrobj -bE:MyDLL.exp -DNDEBUG -I$(INCL1)
CCFLAGS=$(CCFLAGS1) -c
LD=/opt/IBM/xlC/16.1.0/bin/xlclang++
LDFLAGS=$(CCFLAGS1)
LIB_FILE=mydll.so
SOURCEDIR1=.
OBJ_FILES=StdAfx.o GlobData.o Calculations.o
VPATH=$(SOURCEDIR1)
.SUFFIXES: .cpp .o

#Make all:
all :: $(LIB_FILE)

#Compile rule:
.cpp.o:
    $(CCC) $(CCFLAGS) -o$@ $<

#Link rule:
$(LIB_FILE) : $(OBJ_FILES)
    $(LD) $(LDFLAGS) -o $@ $(OBJ_FILES) 
    strip -t -X64 $@

Ошибки соединения:

ld: 0711-317 ERROR: Undefined symbol: .ZTH20GLOB_bTracingEnabled
ld: 0711-317 ERROR: Undefined symbol: .__pt_atexit_np
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.

Компиляция / компоновка с опцией -bnoquiet (как предложено выше) дала следующую информацию (немного прибрала).(Надеюсь, это кому-нибудь пригодится ...)

    /opt/IBM/xlC/16.1.0/bin/xlclang++ -O3 -q64 -qchars=signed -qrtti -qthreaded -qtls=global-dynamic -bnoquiet -qmkshrobj -qmaxmem=-1 -bE:mydll.exp -DNDEBUG -DAIX -DBPC_DLL_EXPORTS -I../Common -I../../../aks/source -I. -o ./mydll.so StdAfx.o  GlobData.o  Calculations.o [...] 
(ld): setopt 64
(ld): halt 4
(ld): setfflag 4
(ld): cdtors 1 all 0 s
(ld): savename ./bpc-urm.so
(ld): filelist 92 2
(ld): setopt noprogram
(ld): noentry
NOENTRY: There is no entry point.
(ld): i /lib/crti_64.o
(ld): i StdAfx.o
(ld): i GlobData.o
(ld): i Calculations.o
[...]
(ld): lib /opt/IBM/xlc/16.1.0/lib/libxlopt.a
(ld): lib /opt/IBM/xlc/16.1.0/lib/libxlipa.a
(ld): lib /opt/IBM/xlc/16.1.0/lib/libxl.a
(ld): lib /usr/lib/libc++.a
(ld): lib /opt/IBM/xlC/16.1.0/lib/libCcore.a
(ld): lib /usr/lib/libpthreads.a
(ld): lib /usr/lib/libm.a
(ld): lib /usr/lib/libatomic.a
(ld): lib /usr/lib/libc.a
LIBRARY: Symbols imported from import file /usr/lib/libc++.a[shr.imp]: 0
LIBRARY: Symbols imported from import file /usr/lib/libc++.a[shr_64.imp]: 1834
LIBRARY: Symbols imported from import file /usr/lib/libc++.a[cxxabi.imp]: 0
LIBRARY: Symbols imported from import file /usr/lib/libc++.a[cxxabi_64.imp]: 354
LIBRARY: Symbols imported from import file /opt/IBM/xlC/16.1.0/lib/libCcore.a[shrcore_32.imp]: 0
LIBRARY: Symbols imported from import file /opt/IBM/xlC/16.1.0/lib/libCcore.a[ansicore_32.imp]: 0
LIBRARY: Symbols imported from import file /opt/IBM/xlC/16.1.0/lib/libCcore.a[shrcore_64.imp]: 131
LIBRARY: Symbols imported from import file /opt/IBM/xlC/16.1.0/lib/libCcore.a[ansicore_64.imp]: 81
LIBRARY: Shared object libpthreads.a[shr_xpg5_64.o]: 346 symbols imported.
LIBRARY: Shared object libatomic.a[libatomic.so.1]: 40 symbols imported.
LIBRARY: Shared object libc.a[shr_64.o]: 3110 symbols imported.
LIBRARY: Shared object libc.a[posix_aio_64.o]: 20 symbols imported.
LIBRARY: Shared object libc.a[aio_64.o]: 18 symbols imported.
LIBRARY: Shared object libc.a[pse_64.o]: 8 symbols imported.
LIBRARY: Shared object libc.a[dl_64.o]: 4 symbols imported.
LIBRARY: Shared object libc.a[pty_64.o]: 1 symbols imported.
LIBRARY: Shared object libc.a[cthread_64.o]: 25 symbols imported.
LIBRARY: Shared object libc.a[uchar_64.o]: 4 symbols imported.
FILELIST: Number of previously inserted files processed: 92
(ld): exports mydll.exp 
EXPORTS: Symbols exported: 59
(ld): resolve
RESOLVE: 6667 of 30031 symbols were kept.
(ld): addgl /usr/lib/glink64.o
ADDGL: Glink code added for 116 symbols.
(ld): er full
ld: 0711-318 ERROR: Undefined symbols were found.
    The following symbols are in error:
 Symbol                    Inpndx  TY CL Source-File(Object-File) OR Import-File{Shared-object}
                              RLD: Address  Section  Rld-type Referencing Symbol
 ----------------------------------------------------------------------------------------------
 ._ZTH20GLOB_bTracingEnabled [240]   ER PR File0.cpp(File0.o)
                                   00000cbc .text    R_RBR    [54]    <.GLOB_EnableTracing@AF26_2>
 ._ZTH20GLOB_bTracingEnabled [386]   ER PR File1.cpp(File1.o)
                                   0000004c .text    R_RBR    [8]     <._ZTW20GLOB_bTracingEnabled>
                                   00001564 .text    R_RBR    [24]    .Namespace2::Function1(...)
                                   0000162c .text    R_RBR    [24]    .Namespace2::Function1(...)
                                   00001690 .text    R_RBR    [24]    .Namespace2::Function1(...)
 ._ZTH20GLOB_bTracingEnabled [563]   ER PR File2.cpp(File2.o)
                                   000013dc .text    R_RBR    [26]    .Class1::Function2(...) const
                                   00001400 .text    R_RBR    [26]    .Class1::Function2(...) const
 ._ZTH20GLOB_bTracingEnabled [782]   ER PR File3.cpp(File3.o)
                                   00001710 .text    R_RBR    [22]    .Class2::Function3(...) const
                                   00001788 .text    R_RBR    [22]    .Class2::Function3(...) const
                                   00001800 .text    R_RBR    [22]    .Class2::Function3(...) const
                                   00001878 .text    R_RBR    [22]    .Class2::Function3(...) const
                                   00001910 .text    R_RBR    [22]    .Class2::Function3(...) const
                                   00001928 .text    R_RBR    [22]    .Class2::Function3(...) const
                                   00001940 .text    R_RBR    [22]    .Class2::Function3(...) const
                                   0000202c .text    R_RBR    [27]    <._ZTW20GLOB_bTracingEnabled>
                                   0000286c .text    R_RBR    [38]    .Class2::Function4(...) const
                                   00003064 .text    R_RBR    [43]    .Class2::Function5(...) const
 ._ZTH20GLOB_bTracingEnabled [283]   ER PR File4.cpp(File4.o)
                                   00000260 .text    R_RBR    [11]    .Class3::Function6(...) const
                                   00000370 .text    R_RBR    [11]    .Class3::Function6(...) const
                                   00000604 .text    R_RBR    [15]    <.IPRA.$Function7(...)>
                                   0000069c .text    R_RBR    [15]    <.IPRA.$Function7(...)>
[...]
 .__pt_atexit_np           [1033]  ER PR Calculations.cpp(Calculations.o)
                                   00003720 .text    R_RBR    [55]    .Namespace1::DoSomething(...)
                                   00003750 .text    R_RBR    [55]    .Namespace1::DoSomething(...)
ER: The return code is 8.
ld: 0711-317 ERROR: Undefined symbol: ._ZTH20GLOB_bTracingEnabled
[...]
ld: 0711-317 ERROR: Undefined symbol: .__pt_atexit_np
make: 1254-004 The error code from the last command is 8.
...