[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug ld/22750] New: .sizeof. directive is handled incorrectly in shared
From: |
hjl.tools at gmail dot com |
Subject: |
[Bug ld/22750] New: .sizeof. directive is handled incorrectly in shared object |
Date: |
Fri, 26 Jan 2018 16:43:41 +0000 |
https://sourceware.org/bugzilla/show_bug.cgi?id=22750
Bug ID: 22750
Summary: .sizeof. directive is handled incorrectly in shared
object
Product: binutils
Version: 2.31 (HEAD)
Status: NEW
Severity: normal
Priority: P2
Component: ld
Assignee: unassigned at sourceware dot org
Reporter: hjl.tools at gmail dot com
Target Milestone: ---
address@hidden sizeof-3]$ cat pr21964-3a.c
#include <stdint.h>
extern int __start___verbose[];
extern int __stop___verbose[];
extern intptr_t sizeof___verbose __attribute__ ((visibility ("hidden")));
int
foo1 (void)
{
static int my_var[5] __attribute__((used, section("__verbose")))
= { 5, 4, 3, 2, 1 };
if (__start___verbose == __stop___verbose
|| __start___verbose[0] != 5
|| sizeof___verbose != (5 * sizeof (int)))
return -1;
else
return 0;
}
address@hidden sizeof-3]$ cat pr21964-3b.c
#include <stdint.h>
extern int __start___verbose[];
extern int __stop___verbose[];
extern intptr_t sizeof___verbose __attribute__ ((visibility ("hidden")));
int
foo2 (void)
{
static int my_var[10] __attribute__((used, section("__verbose")))
= { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
if (__start___verbose == __stop___verbose
|| __start___verbose[0] != 10
|| sizeof___verbose != (10 * sizeof (int)))
return -1;
else
return 0;
}
address@hidden sizeof-3]$ cat pr21964-3c.c
#include <stdio.h>
#include <stdint.h>
extern int foo1 (void);
extern int foo2 (void);
extern int __start___verbose[];
extern int __stop___verbose[];
static int my_var[6] __attribute__((used, section("__verbose")))
= { 6, 4, 3, 2, 1 };
extern intptr_t sizeof___verbose __attribute__ ((visibility ("hidden")));
int
bar (void)
{
if (__start___verbose == __stop___verbose)
return -1;
if (__start___verbose[0] != 6
|| sizeof___verbose != (6 * sizeof (int)))
return -2;
else
return 0;
}
int
main ()
{
if (bar () == 0
&& foo1 () == 0
&& foo2 () == 0)
printf ("PASS\n");
else
printf ("FAIL\n");
return 0;
}
address@hidden sizeof-3]$ cat pr21964-3d.s
.data
.align 8
.ifdef UNDERSCORE
.globl _sizeof___verbose
.type _sizeof___verbose, %object
_sizeof___verbose:
.dc.a .sizeof. (__verbose)
.size _sizeof___verbose, .-_sizeof___verbose
.else
.globl sizeof___verbose
.type sizeof___verbose, %object
sizeof___verbose:
.dc.a .sizeof. (__verbose)
.size sizeof___verbose, .-sizeof___verbose
.endif
address@hidden sizeof-3]$ make
gcc -B./ -g -c -o pr21964-3c.o pr21964-3c.c
as -o pr21964-3d.o pr21964-3d.s
gcc -B./ -g -fPIC -c -o pr21964-3a.o pr21964-3a.c
./ld -shared -o pr21964-3a.so pr21964-3a.o pr21964-3d.o
gcc -B./ -g -fPIC -c -o pr21964-3b.o pr21964-3b.c
./ld -shared -o pr21964-3b.so pr21964-3b.o pr21964-3d.o
gcc -B./ -o pr21964-3 pr21964-3c.o pr21964-3d.o pr21964-3a.so pr21964-3b.so
-Wl,-R,.
./pr21964-3
FAIL
address@hidden sizeof-3]$
address@hidden sizeof-3]$ gdb ./pr21964-3
GNU gdb (GDB) Fedora 8.0.1-35.0.fc27
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./pr21964-3...done.
(gdb) b main
Breakpoint 1 at 0x40068d: file pr21964-3c.c, line 29.
(gdb) r
Starting program: /export/home/hjl/bugs/binutils/sizeof-3/pr21964-3
Missing separate debuginfos, use: dnf debuginfo-install
glibc-2.26-25.0.fc27.x86_64
Breakpoint 1, main () at pr21964-3c.c:29
29 if (bar () == 0
(gdb) list
24 }
25
26 int
27 main ()
28 {
29 if (bar () == 0
30 && foo1 () == 0
31 && foo2 () == 0)
32 printf ("PASS\n");
33 else
(gdb) call bar ()
$1 = 0
(gdb) call foo1 ()
$2 = -1
(gdb) call foo2 ()
$3 = -1
(gdb)
.sizeof. (__verbose) in shared object gets the size of __verbose
in executable.
--
You are receiving this mail because:
You are on the CC list for the bug.
- [Bug ld/22750] New: .sizeof. directive is handled incorrectly in shared object,
hjl.tools at gmail dot com <=