This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
SOLVED - Re: ld: howto link a whole library or object file content to a specific section
- From: CortexFan <giancarlo dot parodi at gmail dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Thu, 16 Dec 2010 05:05:46 -0800 (PST)
- Subject: SOLVED - Re: ld: howto link a whole library or object file content to a specific section
- References: <AANLkTimmxRq1OMEeNYyhoaOsZN_R+fWjmQ-ULScJJFXS@mail.gmail.com>
Dear all,
finally I sorted this out also thanks(!) to this previous post:
http://gcc.gnu.org/ml/gcc-help/2010-12/msg00176.html
It is both because of a prefix wildcard missing, and the way my build tools
work. I changed the syntax to
.my_sysshared :
{
*syscalls_minimal.o
*\libgcc.a:*
*\libc.a:*
} > SysShared
and this now is doing what I would expect, namely place the libs and the
content of syscalls_minimal.o into .my_sysshared section
For the records, regarding the syscalls_minimal.o part, my linker command
line looked something like:
-T ./.../linker.ld -mcpu=cortex-m1 -mthumb -Wl,-Map="./result.map"
--gc-sections -o result.elf ... "./syscalls_minimal.o" ...
this is the linker command line generated by the IDE I use (Keil uVision4)
for building the Cortex target image via gcc, it is passed to the linker
during the build process.
My personal explanation for this:
It seems that if I specify the filename without the leading *, the linker
treats "syscalls_minimal.o" and "./syscalls_minimal.o" as two different
files, although they have the same content. I think this is because of the
fact that windows uses backslashes for directories, so the characters "./"
are seen as integral part of the file name.
This is the map file I was getting:
.my_sysshared 0x10085000 0x2b54
syscalls_minimal.o()
.text 0x10085000 0x108 syscalls_minimal.o
.data 0x10085108 0x4 syscalls_minimal.o
.bss 0x1008510c 0x8 syscalls_minimal.o
...
...
.text 0x180004a4 0x108 ./syscalls_minimal.o
0x180004a4 _close
0x180004aa _fstat
0x180004b4 _isatty
0x180004b8 _lseek
0x180004bc _read
0x180004c0 _sbrk
0x18000500 _open
0x18000506 _link
...
...
The linker referenced the same object module twice during the link, once as
syscall_minimal.o and once as ./syscall_minimal.o, then placed one copy in
the desired section (from "syscalls_minimal.o), and another copy in the
default .text section (from "./syscalls_minimal.o" which is passed on
command line).
At the end it was resulting in duplicate symbols, giving a link error >-(
I believe it is explained by the end of section 3.6.4.1 of the manual:
When you use a file name which is not an âarchive:fileâ specifier and does
not contain
any wild card characters, the linker will first see if you also specified
the file name on the
linker command line or in an INPUT command. If you did not, the linker will
attempt to
open the file as an input file, as though it appeared on the command line.
The linker opened up "syscalls_minimal.o" himself, because of the mentioned
rule.
Adding the wildcard makes the problem disappear, as then *syscalls_minimal.o
covers both cases, so the file gets used by the linker only once. Probably
on Linux I would have never saw the problem &-(
Hope this can help also others in similar issues :-)
Cheers,
Giancarlo
CortexFan wrote:
>
> ..snip...
>
> however this does not work, and it seems that the linker is including
> again the text, data, bss sections within syscalls_minimal.o in the
> rest of the default sections I have defined later on - so I get errors
> of multiple definition of symbols like _close _fstat etc. I thought
> the text data bss from syscalls_minimal.o would be used only once.
> Using EXCLUDE_FILE (*syscalls_minimal.o) within the other sections
> defined, to tell the linker to explicitly ignore the file at that
> time, does not solve the problem.
>
>
> 2. second option mentioned in section 3.6.4.1 of the ld manual
> suggests using the 'archive:file' method to indicate an archive (or a
> file located within an archive) to be taken as an input to be placed
> in a specific section.
>
> Assuming the archive is called libc.a, I tried several ways like using
> (for example) the notation
>
> .my_lib:
> {
> libc.a:lib_a-memcmp.o
>
> } > RAM_lib
>
> but this does not work either.
>
>
>
--
View this message in context: http://old.nabble.com/ld%3A-howto-link-a-whole-library-or-object-file-content-to-a-specific-section-tp30464246p30472436.html
Sent from the gcc - Help mailing list archive at Nabble.com.