* gold doesn't accept object file as script
@ 2011-01-25 7:20 Vladimir Simonov
2011-01-25 15:15 ` Ian Lance Taylor
0 siblings, 1 reply; 4+ messages in thread
From: Vladimir Simonov @ 2011-01-25 7:20 UTC (permalink / raw)
To: Ian Lance Taylor; +Cc: binutils
Hi Ian,
According "man ld" "If the linker cannot recognize the format
of an object file, it will assume that it is a linker script."
But gold doesn't follow above. For details, see test case below.
Briefly, the command "gcc -fuse-ld=gold -o a.4 -shared exports.ld a.a"
if exports.ld is linker script leads to warning
"exports.ld:1:8: ignoring command OPTION; OPTION is only valid for
scripts specified via -T/--script" and resulted shared library
doesn't contain func_a.
exports.ld contains only EXTERN(func_a)
This feature is used to link func_a (located in static library)
into shared one.
Is it by gold design or a bug?
Should I file it or it is duplicate?
What is the best way to workaround the problem?
--Wl,--undefined=func_a?
Thank you in advance
Vladimir Simonov
$ cat exports.ld
EXTERN(func_a)
$ cat b.sh
#!/bin/bash
PREF=/opt/gcc-4.4.3-glibc-2.3.2/bin/i686-unknown-linux-gnu-
rm -f a.o a.a a.1 a.2 a.3 a.4
${PREF}gcc -c -o a.o -fPIC a.c
${PREF}ar rcs a.a a.o
echo Build shared from obj by bfd
${PREF}gcc -o a.1 -shared a.o
${PREF}readelf -a a.1 | grep func_a
echo Build shared from lib by bfd
${PREF}gcc -o a.2 -shared exports.ld a.a
${PREF}readelf -a a.2 | grep func_a
echo Build shared from obj by gold
${PREF}gcc -fuse-ld=gold -o a.3 -shared a.o
${PREF}readelf -a a.3 | grep func_a
echo Build shared from lib by gold
${PREF}gcc -fuse-ld=gold -o a.4 -shared exports.ld a.a
${PREF}readelf -a a.4 | grep func_a
echo DONE
$ ./b.sh
Build shared from obj by bfd
1: 000003dc 38 FUNC GLOBAL DEFAULT 10 func_a
44: 000003dc 38 FUNC GLOBAL DEFAULT 10 func_a
Build shared from lib by bfd
1: 000003dc 38 FUNC GLOBAL DEFAULT 10 func_a
44: 000003dc 38 FUNC GLOBAL DEFAULT 10 func_a
Build shared from obj by gold
6: 0000043c 38 FUNC GLOBAL DEFAULT 11 func_a
27: 0000043c 38 FUNC GLOBAL DEFAULT 11 func_a
Build shared from lib by gold
/opt/gcc-4.4.3-glibc-2.3.2/bin/../lib/gcc/i686-unknown-linux-gnu/4.4.3/../../../../i686-unknown-linux-gnu/bin/ld.gold:
warning: exports.ld:1:8: ignoring command OPTION; OPTION is only valid for scripts
specified via -T/--script
DONE
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: gold doesn't accept object file as script
2011-01-25 7:20 gold doesn't accept object file as script Vladimir Simonov
@ 2011-01-25 15:15 ` Ian Lance Taylor
2011-01-25 16:33 ` Vladimir Simonov
0 siblings, 1 reply; 4+ messages in thread
From: Ian Lance Taylor @ 2011-01-25 15:15 UTC (permalink / raw)
To: Vladimir Simonov; +Cc: binutils
[-- Attachment #1: Type: text/plain, Size: 985 bytes --]
Vladimir Simonov <sv@sw.ru> writes:
> According "man ld" "If the linker cannot recognize the format
> of an object file, it will assume that it is a linker script."
>
> But gold doesn't follow above. For details, see test case below.
That turns out not to be the case. Gold does implement that.
> Briefly, the command "gcc -fuse-ld=gold -o a.4 -shared exports.ld a.a"
> if exports.ld is linker script leads to warning
> "exports.ld:1:8: ignoring command OPTION; OPTION is only valid for
> scripts specified via -T/--script" and resulted shared library
> doesn't contain func_a.
> exports.ld contains only EXTERN(func_a)
Internally gold implements EXTERN via OPTION, and as the warning says
gold only permits OPTION in a script specified via -T/--script. So the
bug is that EXTERN is implemented as OPTION.
Fortunately, the fix is simple, as the necessary framework was
introduced for other reasons. Would you mind giving this patch a try to
see if it fixes your problem?
Ian
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: extern --]
[-- Type: text/x-diff, Size: 922 bytes --]
Index: script.cc
===================================================================
RCS file: /cvs/src/src/gold/script.cc,v
retrieving revision 1.79
diff -u -p -r1.79 script.cc
--- script.cc 3 Nov 2010 17:18:23 -0000 1.79
+++ script.cc 25 Jan 2011 15:13:08 -0000
@@ -2576,12 +2576,8 @@ yyerror(void* closurev, const char* mess
extern "C" void
script_add_extern(void* closurev, const char* name, size_t length)
{
- // We treat exactly like -u NAME. FIXME: If it seems useful, we
- // could handle this after the command line has been read, by adding
- // entries to the symbol table directly.
- std::string arg("--undefined=");
- arg.append(name, length);
- script_parse_option(closurev, arg.c_str(), arg.size());
+ Parser_closure* closure = static_cast<Parser_closure*>(closurev);
+ closure->script_options()->add_symbol_reference(name, length);
}
// Called by the bison parser to add a file to the link.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: gold doesn't accept object file as script
2011-01-25 15:15 ` Ian Lance Taylor
@ 2011-01-25 16:33 ` Vladimir Simonov
2011-01-25 18:55 ` Ian Lance Taylor
0 siblings, 1 reply; 4+ messages in thread
From: Vladimir Simonov @ 2011-01-25 16:33 UTC (permalink / raw)
To: Ian Lance Taylor; +Cc: binutils
On 01/25/2011 06:15 PM, Ian Lance Taylor wrote:
> Vladimir Simonov<sv@sw.ru> writes:
>
>> According "man ld" "If the linker cannot recognize the format
>> of an object file, it will assume that it is a linker script."
>>
>> But gold doesn't follow above. For details, see test case below.
>
> That turns out not to be the case. Gold does implement that.
>
>> Briefly, the command "gcc -fuse-ld=gold -o a.4 -shared exports.ld a.a"
>> if exports.ld is linker script leads to warning
>> "exports.ld:1:8: ignoring command OPTION; OPTION is only valid for
>> scripts specified via -T/--script" and resulted shared library
>> doesn't contain func_a.
>> exports.ld contains only EXTERN(func_a)
>
> Internally gold implements EXTERN via OPTION, and as the warning says
> gold only permits OPTION in a script specified via -T/--script. So the
> bug is that EXTERN is implemented as OPTION.
>
> Fortunately, the fix is simple, as the necessary framework was
> introduced for other reasons. Would you mind giving this patch a try to
> see if it fixes your problem?
>
> Ian
>
Perfect. The test is passed.
Thank you a lot.
Vladimir Simonov
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: gold doesn't accept object file as script
2011-01-25 16:33 ` Vladimir Simonov
@ 2011-01-25 18:55 ` Ian Lance Taylor
0 siblings, 0 replies; 4+ messages in thread
From: Ian Lance Taylor @ 2011-01-25 18:55 UTC (permalink / raw)
To: Vladimir Simonov; +Cc: binutils
Vladimir Simonov <sv@sw.ru> writes:
> On 01/25/2011 06:15 PM, Ian Lance Taylor wrote:
>> Fortunately, the fix is simple, as the necessary framework was
>> introduced for other reasons. Would you mind giving this patch a try to
>> see if it fixes your problem?
>
> Perfect. The test is passed.
Thanks for testing it. Committed with this ChangeLog entry.
Ian
2011-01-25 Ian Lance Taylor <iant@google.com>
* script.cc (script_add_extern): Rewrite to use
add_symbol_reference.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-01-25 18:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-25 7:20 gold doesn't accept object file as script Vladimir Simonov
2011-01-25 15:15 ` Ian Lance Taylor
2011-01-25 16:33 ` Vladimir Simonov
2011-01-25 18:55 ` Ian Lance Taylor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).