C ++ 64 bit - unable to read characters: archive has no index; run runlib to add one

I am trying to create a very simple binary on Linux RHAS 5.3 64 bit using a static library.

test1.cpp, which as a result of .o will be built into the static library.

void ctest1(int *i) { *i=5; } 

and prog.cpp

 #include <stdio.h> void ctest1(int *); int main() { int x; ctest1(&x); printf("Valx=%d\n",x); return 0; } 

If I compile in 32 bits, no problem:

- (0931: Wed, Apr 6 11: $) - g ++ -m32 -Wall -c ctest1.cpp
- (0931: Wed, Apr 6, 11: $) - file ctest1.o
ctest1.o: 32-bit LSB with 32-bit replacement, Intel 80386 version 1 (SYSV), not shared
- (0931: Wed, April 06, 11: $) - ar -cvq libctest.a ctest1.o
a - ctest1.o
- (0931: Wed, Apr 6, 11: $) - g ++ -m32 -o prog prog.cpp libctest.a
- (0931: Wed, April 06, 11: $) -./prog
Valx = 5

However, if I try to compile in 64 bits, it will fail during the communication with the error "could not read the characters: the archive has no index, run runlib to add one":

- (0933: Wed, Apr 6, 11: $) - g ++ -m64 -Wall -c ctest1.cpp
- (0935: Wed, Apr 06 11: $) - file ctest1.o
ctest1.o: 64-bit LSB with 64-bit LSB, AMD x86-64 version 1 (SYSV), not shared
- (0933: Wed, Apr 6, 11: $) - ar -cvq libctest.a ctest1.o
a - ctest1.o
- (0935: Wed, Apr 6, 11: $) - g ++ -m64 -o prog prog.cpp libctest.a
libctest.a: could not read the characters: the archive has no index; run runlib to add one
collect2: ld returned 1 exit status

Running ranlib on libctest.a does not change anything.

My version of Linux is next

- (0937: Wed, Apr 6 11: $) - uname -a
Linux dev1 2.6.18-128.el5 # 1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU / Linux

Does anyone have an idea where the problem comes from?

Thanks.

+4
source share
1 answer

Did you delete the library before recompiling with the 64-bit build?

Your compilation sequence worked for me:

 $ g++ -m64 -Wall -c prog.cpp $ g++ -m64 -Wall -c test1.cpp $ ar -cvq libtest.a test1.o a - test1.o $ g++ -m64 -Wall -o prog1 prog.o libtest.a $ file test1.o prog.o test1.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped prog.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped $ ./prog1 Valx=5 $ 

When I compiled a 32-bit file:

 $ g++ -m32 -Wall -c prog.cpp $ g++ -m32 -Wall -c test1.cpp $ file test1.o prog.o test1.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped prog.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped $ ar -cvq libtest.a test1.o a - test1.o $ g++ -m32 -Wall -o prog1 prog.o libtest.a /usr/bin/ld: warning: i386:x86-64 architecture of input file `libtest.a(test1.o)' is incompatible with i386 output $ file prog1 prog1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped $ ./prog1 Memory fault $ 

These are several RHEL 5 releases (not all of them are current):

 Linux toru 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux 

My GCC is version 4.1.2. My version of AR is next, and RANLIB prints the same version:

 GNU ar 2.17.50.0.6-9.el5 20061020 

I did not need to use ranlib directly.

+1
source

Source: https://habr.com/ru/post/1346839/


All Articles