This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/56880] New: R_X86_64_COPY bug


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: unassigned@gcc.gnu.org
        ReportedBy: fredrickprashanth@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]