bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/19460] New: Wrong function call when use weak statement


From: thln47 at free dot fr
Subject: [Bug ld/19460] New: Wrong function call when use weak statement
Date: Wed, 13 Jan 2016 13:32:41 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=19460

            Bug ID: 19460
           Summary: Wrong function call when use weak statement
           Product: binutils
           Version: unspecified
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ld
          Assignee: unassigned at sourceware dot org
          Reporter: thln47 at free dot fr
  Target Milestone: ---

Hello,

Host : PC mingw32
Target : PC mingw32

I have a problem when I use weak statement with two functions.
The linker keep the address of the first function for all of the followings.
The problem occurs even I compile module1.c alone or with module2.
I try to change the optimization flags but I have the same result.
When I use another gcc version (GCC 4.9.3 for Cywin64) it's works.

Thanks for reply.

------------------------------------------------------------------------------------
Here is output :
------------------------------------------------------------------------------------
WEAK BUG Checker Compiler version : 4.8.1!
function_Get_F1 = 004016B0
function_Get_F2 = 004016B0
..\src\module1.c : Get_F1
..\src\module1.c : Get_F1
BUG (test=1)

------------------------------------------------------------------------------------
Here is my code for module1.c
------------------------------------------------------------------------------------
/*
 * module1.c
 *
 *  Created on: Jan 11, 2016
 *      Author: Thierry
 */
#include <stdio.h>
#include <stdint.h>

//#define __WEAK
#define __WEAK                          __attribute__((weak))

extern uint16_t Get_F1(void);
extern uint16_t Get_F2(uint16_t param_index);



__WEAK uint16_t Get_F1(void) {
        printf("%s : %s\n", __FILE__, __FUNCTION__);
        return 1;
}

__WEAK uint16_t Get_F2(uint16_t param_index) {
        printf("%s : %s\n", __FILE__, __FUNCTION__);
        return 1+param_index;
}


void bug_highlight(void) {
        uint16_t        (* function_Get_F1)(void);
        uint16_t        (* function_Get_F2)(uint16_t param_index);


        function_Get_F1 = &Get_F1;
        function_Get_F2 = &Get_F2;

        printf("function_Get_F1 = %p\n", function_Get_F1);
        printf("function_Get_F2 = %p\n", function_Get_F2);

        uint16_t test;

        test = Get_F1();
        test = Get_F2(test);

        if (test==2) {
                printf("test Ok with module1\n");
        } else if (test==20) {
                printf("test Ok with module2\n");
        } else {
                printf("BUG (test=%d)\n", test);
        }
}

int main(void){
        setbuf(stdout, NULL);

        printf("WEAK BUG Checker Compiler version : %s!\n", __VERSION__);

        bug_highlight();

        return 0;
}
------------------------------------------------------------------------------------
Here is my code for module2.c
------------------------------------------------------------------------------------
/*
 * module2.c
 *
 *  Created on: Jan 11, 2016
 *      Author: Thierry
 */
#include <stdio.h>
#include <stdint.h>

uint16_t Get_F1(void) {
        printf("%s : %s\n", __FILE__, __FUNCTION__);
        return 10;
}

uint16_t Get_F2(uint16_t param_index) {
        printf("%s : %s\n", __FILE__, __FUNCTION__);
        return 10+param_index;
}
------------------------------------------------------------------------------------
Here is compiler command line
------------------------------------------------------------------------------------
gcc -O0 -g3 -Wall -c -fmessage-length=0 -Wextra -v -o src\module1.o
..\src\module1.c 

Using built-in specs.
COLLECT_GCC=D:\Atollic\TrueSTUDIO for ARM 5.4.0\PCTools\bin\gcc.exe
Target: mingw32
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32
--build=mingw32 --without-pic --enable-shared --enable-static --with-gnu-ld
--enable-lto --enable-libssp --disable-multilib
--enable-languages=c,c++,fortran,objc,obj-c++,ada --disable-sjlj-exceptions
--with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug
--enable-version-specific-runtime-libs
--with-gmp=/usr/src/pkg/gmp-5.1.2-1-mingw32-src/bld
--with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --with-mpfr=
--with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-libgomp
--enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/mingw
--disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T
Thread model: win32
gcc version 4.8.1 (GCC) 
COLLECT_GCC_OPTIONS='-O0' '-g3' '-Wall' '-c' '-fmessage-length=0' '-Wextra'
'-v' '-o' 'src\module1.o' '-mtune=generic' '-march=pentiumpro'
 d:/atollic/truestudio for arm
5.4.0/pctools/bin/../libexec/gcc/mingw32/4.8.1/cc1.exe -quiet -v -iprefix
d:\atollic\truestudio for arm 5.4.0\pctools\bin\../lib/gcc/mingw32/4.8.1/ -dD
..\src\module1.c -quiet -dumpbase module1.c -mtune=generic -march=pentiumpro
-auxbase-strip src\module1.o -g3 -O0 -Wall -Wextra -version -fmessage-length=0
-o C:\Users\Thierry\AppData\Local\Temp\cc1BmIoz.s
GNU C (GCC) version 4.8.1 (mingw32)
        compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.2,
MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "d:/atollic/truestudio for arm
5.4.0/pctools/lib/gcc/../../lib/gcc/mingw32/4.8.1/include"
ignoring duplicate directory "d:/atollic/truestudio for arm
5.4.0/pctools/lib/gcc/../../lib/gcc/mingw32/4.8.1/../../../../include"
ignoring nonexistent directory "/mingw/include"
ignoring duplicate directory "d:/atollic/truestudio for arm
5.4.0/pctools/lib/gcc/../../lib/gcc/mingw32/4.8.1/include-fixed"
ignoring duplicate directory "d:/atollic/truestudio for arm
5.4.0/pctools/lib/gcc/../../lib/gcc/mingw32/4.8.1/../../../../mingw32/include"
ignoring nonexistent directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 d:\atollic\truestudio for arm
5.4.0\pctools\bin\../lib/gcc/mingw32/4.8.1/include
 d:\atollic\truestudio for arm
5.4.0\pctools\bin\../lib/gcc/mingw32/4.8.1/../../../../include
 d:\atollic\truestudio for arm
5.4.0\pctools\bin\../lib/gcc/mingw32/4.8.1/include-fixed
 d:\atollic\truestudio for arm
5.4.0\pctools\bin\../lib/gcc/mingw32/4.8.1/../../../../mingw32/include
End of search list.
GNU C (GCC) version 4.8.1 (mingw32)
        compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.2,
MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 767202a405449496e68a54c4eee91a28
COLLECT_GCC_OPTIONS='-O0' '-g3' '-Wall' '-c' '-fmessage-length=0' '-Wextra'
'-v' '-o' 'src\module1.o' '-mtune=generic' '-march=pentiumpro'
 d:/atollic/truestudio for arm
5.4.0/pctools/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/as.exe -v -o
src\module1.o C:\Users\Thierry\AppData\Local\Temp\cc1BmIoz.s
GNU assembler version 2.23.2 (mingw32) using BFD version (GNU Binutils) 2.23.2
COMPILER_PATH=d:/atollic/truestudio for arm
5.4.0/pctools/bin/../libexec/gcc/mingw32/4.8.1/;d:/atollic/truestudio for arm
5.4.0/pctools/bin/../libexec/gcc/;d:/atollic/truestudio for arm
5.4.0/pctools/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/
LIBRARY_PATH=d:/atollic/truestudio for arm
5.4.0/pctools/bin/../lib/gcc/mingw32/4.8.1/;d:/atollic/truestudio for arm
5.4.0/pctools/bin/../lib/gcc/;d:/atollic/truestudio for arm
5.4.0/pctools/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/lib/;d:/atollic/truestudio
for arm 5.4.0/pctools/bin/../lib/gcc/mingw32/4.8.1/../../../
COLLECT_GCC_OPTIONS='-O0' '-g3' '-Wall' '-c' '-fmessage-length=0' '-Wextra'
'-v' '-o' 'src\module1.o' '-mtune=generic' '-march=pentiumpro'
gcc -o weak_bug.exe src\module1.o 

------------------------------------------------------------------------------------
Here is disassemby of bug_highlight function
------------------------------------------------------------------------------------

29        void bug_highlight(void) {
          bug_highlight:
0040170b:   push %ebp
0040170c:   mov %esp,%ebp
0040170e:   sub $0x28,%esp
34              function_Get_F1 = &Get_F1;
00401711:   movl $0x4016b0,-0xc(%ebp)
35              function_Get_F2 = &Get_F2;
00401718:   movl $0x4016b0,-0x10(%ebp)
37              printf("function_Get_F1 = %p\n", function_Get_F1);
0040171f:   mov -0xc(%ebp),%eax
00401722:   mov %eax,0x4(%esp)
00401726:   movl $0x40507e,(%esp)
0040172d:   call 0x403778 <printf>
38              printf("function_Get_F2 = %p\n", function_Get_F2);
00401732:   mov -0x10(%ebp),%eax
00401735:   mov %eax,0x4(%esp)
00401739:   movl $0x405094,(%esp)
00401740:   call 0x403778 <printf>
42              test = Get_F1();
00401745:   call 0x4016b0 <Get_F1>
0040174a:   mov %ax,-0x12(%ebp)
43              test = Get_F2(test);
0040174e:   movzwl -0x12(%ebp),%eax
00401752:   mov %eax,(%esp)
00401755:   call 0x4016b0 <Get_F1>     <------------------------------------
BUG !
0040175a:   mov %ax,-0x12(%ebp)
45              if (test==2) {
0040175e:   cmpw $0x2,-0x12(%ebp)
00401763:   jne 0x401773 <bug_highlight+104>
46                      printf("test Ok with module1\n");
00401765:   movl $0x4050aa,(%esp)
0040176c:   call 0x403780 <puts>
00401771:   jmp 0x40179c <bug_highlight+145>
47              } else if (test==20) {
00401773:   cmpw $0x14,-0x12(%ebp)
00401778:   jne 0x401788 <bug_highlight+125>
48                      printf("test Ok with module2\n");
0040177a:   movl $0x4050bf,(%esp)
00401781:   call 0x403780 <puts>
00401786:   jmp 0x40179c <bug_highlight+145>
50                      printf("BUG (test=%d)\n", test);
00401788:   movzwl -0x12(%ebp),%eax
0040178c:   mov %eax,0x4(%esp)
00401790:   movl $0x4050d4,(%esp)
00401797:   call 0x403778 <printf>
52        }
0040179c:   leave 
0040179d:   ret

------------------------------------------------------------------------------------
Here is the part of bug_highlight function procuced by gcc
------------------------------------------------------------------------------------
...

_bug_highlight:
LFB8:
        .loc 1 29 0
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        subl    $40, %esp
        .loc 1 34 0
        movl    $_Get_F1, -12(%ebp)
        .loc 1 35 0
        movl    $_Get_F2, -16(%ebp)
        .loc 1 37 0
        movl    -12(%ebp), %eax
        movl    %eax, 4(%esp)
        movl    $LC2, (%esp)
        call    _printf
        .loc 1 38 0
        movl    -16(%ebp), %eax
        movl    %eax, 4(%esp)
        movl    $LC3, (%esp)
        call    _printf
        .loc 1 42 0
        call    _Get_F1
        movw    %ax, -18(%ebp)
        .loc 1 43 0
        movzwl  -18(%ebp), %eax
        movl    %eax, (%esp)
        call    _Get_F2                         <--------------------------
correct !
        movw    %ax, -18(%ebp)
        .loc 1 45 0
        cmpw    $2, -18(%ebp)
        jne     L6
        .loc 1 46 0
        movl    $LC4, (%esp)
        call    _puts
        jmp     L5
...

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]