http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56880



             Bug #: 56880

           Summary: R_X86_64_COPY bug

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: fredrickprasha...@gmail.com





A struct with zero length array is defined in a shared library as a global

data.

A binary links with this shared library and accesses the struct.

Because of copy relocation semantics, the binary linking with that

library sees(correctly) only the portion of the struct without the

zero length array.

We understand that it is due to the wrong or apparent size calculation

of the struct by GCC and using copy relocation semantics to resolve this

shared symbol is causing this problem.



We saw this bug also on ARM with R_ARM_COPY.





test_misc.h:

#ifndef __TEST_MISC_H__

#define __TEST_MISC_H__

struct test_array {

int array_len;

int array[];

};



void print_array(struct test_array *);

#endif



test_lib.c:

#include "test_misc.h"

#include <stdio.h>

struct test_array test_dynamic = {

6,

{1, 2, 3, 4, 5, 6},

};



void

print_array(struct test_array *a) {

int i;

for (i = 0; i<a->array_len; i++) {

printf("%d\n", a->array[i]);

}

}



test_misc.c:

#include "test_misc.h"

extern struct test_array test_dynamic;

int

main() {

print_array(&test_dynamic);

return 0;

}



Makefile:

all: test_misc.bin



test_misc.bin: test_misc.o libtest.so

cc test_misc.o libtest.so -o test_misc.bin



libtest.so: test_lib.o

cc -shared -Wl,-soname,libtest.so -o libtest.so test_lib.o



test_lib.o: test_lib.c

cc -fPIC -o test_lib.o -c test_lib.c

.PHONY: clean

clean:

rm -rf test_misc.bin

rm -rf libtest.so

rm -rf *.o





$ LD_LIBRARY_PATH=. ./test_misc.bin

0

0

0

0

0

0









This seems to be a bug in GCC:





        .globl  test_dynamic

        .data

        .align 4

        .type   test_dynamic, @object

        .size   test_dynamic, 4

test_dynamic:

        .long   6

        .long   1

        .long   2

        .long   3

        .long   4

        .long   5

        .long   6

Reply via email to