[LLVMbugs] [Bug 2614] New: Redefined symbols with llvm-gcc with -std=c99 and -O1 ( or higher)
bugzilla-daemon at cs.uiuc.edu
bugzilla-daemon at cs.uiuc.edu
Thu Jul 31 00:52:10 PDT 2008
http://llvm.org/bugs/show_bug.cgi?id=2614
Summary: Redefined symbols with llvm-gcc with -std=c99 and -O1
(or higher)
Product: tools
Version: 2.3
Platform: PC
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: llvm-gcc
AssignedTo: unassignedbugs at nondot.org
ReportedBy: llvm at assumetheposition.nl
CC: llvmbugs at cs.uiuc.edu
Given two very simple .c files:
main.c
------
#include <stdlib.h>
int
main(int argc, char **argv)
{
}
module.c
--------
#include <stdlib.h>
If I compile each of these with plain gcc using -std=c99 and -O1 followed by
linking them, all is well. But if I replace gcc with llvm-gcc I get multiply
defined symbols:
llvm-gcc -c -O1 -std=c99 main.c
llvm-gcc -c -O1 -std=c99 module.c
llvm-gcc -o main main.o module.o
module.o(.text+0x0): In function `strtod':
: multiple definition of `strtod'
main.o(.text+0x0): first defined here
module.o(.text+0x30): In function `strtoull':
: multiple definition of `strtoull'
main.o(.text+0x40): first defined here
module.o(.text+0x60): In function `strtoll':
: multiple definition of `strtoll'
main.o(.text+0x70): first defined here
module.o(.text+0x90): In function `strtold':
: multiple definition of `strtold'
main.o(.text+0xa0): first defined here
module.o(.text+0xc0): In function `strtof':
[...]
Looking at the assembly output it seems the string functions get pulled into
both modules and therefore clash. E.g. llvm-gcc -S -O1 -std=c99 module.c
produces
.text
.align 16
.globl strtod
.type strtod, at function
strtod:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 12(%ebp), %ecx
movl %ecx, 4(%esp)
movl 8(%ebp), %ecx
movl %ecx, (%esp)
movl $0, 8(%esp)
call __strtod_internal
addl $16, %esp
popl %ebp
ret
.size strtod, .-strtod
.align 16
.globl strtoull
.type strtoull, at function
strtoull:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 16(%ebp), %ecx
movl %ecx, 8(%esp)
movl 12(%ebp), %ecx
movl %ecx, 4(%esp)
movl 8(%ebp), %ecx
movl %ecx, (%esp)
movl $0, 12(%esp)
call __strtoull_internal
addl $16, %esp
popl %ebp
ret
.size strtoull, .-strtoull
[...]
while module.s also contains the exact same functions.
Running llvm-gcc -S -O1 -std=c99 module.c (i.e. without the c99 flag) produces
merely
.section .note.GNU-stack,"", at progbits
.ident "GCC: (GNU) 4.2.1 (Based on Apple Inc. build 5555) (LLVM build
2.3)"
Using -std=c99 without any optimization (-O0) also produces the same output
(jus t the two lines).
This is on a Fedora Core 4 system (whose gcc version is 4.0.2), with LLVM 2.3
and the precompiled RHEL4 llvm-gcc-4.2 binaries.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list