[Bug c/56880] New: R_X86_64_COPY bug

2013-04-08 Thread fredrickprashanth at gmail dot com


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 

struct test_array test_dynamic = {

6,

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

};



void

print_array(struct test_array *a) {

int i;

for (i = 0; iarray_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


[Bug c/56880] R_X86_64_COPY bug

2013-04-08 Thread fredrickprashanth at gmail dot com


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



--- Comment #1 from Fredrick  2013-04-08 
16:51:06 UTC ---

Another related bug would be that, we tried to disable copy relocation

using -z nocopyreloc. The binary crashed with SEGV.





./test_misc.bin: Symbol `test_dynamic' causes overflow in R_X86_64_32

relocation

Segmentation fault (core dumped)



-Fredrick


[Bug middle-end/28865] Structures with a flexible arrray member have wrong .size

2013-04-09 Thread fredrickprashanth at gmail dot com


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



--- Comment #7 from Fredrick  2013-04-09 
18:10:34 UTC ---

HJ,



Thanks for pointing the patch.



The patch works. I tested it on x86-64. 

Could this patch be integrated into the mainline GCC?



Thanks,

Fredrick