This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Issue while using -rdynamic with binutils 2.22-8
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Makarand Pradhan <makarandpradhan at ruggedcom dot com>
- Cc: Alan Modra <amodra at gmail dot com>, Binutils <binutils at sourceware dot org>
- Date: Thu, 30 Jan 2014 07:43:31 -0800
- Subject: Re: Issue while using -rdynamic with binutils 2.22-8
- Authentication-results: sourceware.org; auth=none
- References: <CAMe9rOp8H_9To8ytZg10Kf=CmhNRfvDqHkcsimgosB8j9w5PJg at mail dot gmail dot com> <CAMe9rOr_E9eQ6FrHHJ63peqVR2RVmvx8drKyGxnFrHOoujuKYQ at mail dot gmail dot com> <52EA6B3F dot 3010604 at ruggedcom dot com>
On Thu, Jan 30, 2014 at 7:09 AM, Makarand Pradhan
<makarandpradhan@ruggedcom.com> wrote:
> On 29/01/14 06:26 PM, H.J. Lu wrote:
>>
>> On Wed, Jan 29, 2014 at 2:12 PM, H.J. Lu<hjl.tools@gmail.com> wrote:
>>>
>>> On Wed, Jan 29, 2014 at 1:31 PM, Makarand Pradhan
>>> <makarandpradhan@ruggedcom.com> wrote:
>>>>
>>>> Hi All,
>>>>
>>>> We are in the process of migrating from binutils 2.20.1-16 to 2.22-8.
>>>>
>>>> I notice an issue while using linker option -rdynamic. Details below:
>>>>
>>>> I'm using the sample code given at the end of this email for the test.
>>>> The
>>>> code links fine in 2.20.1-16, but fails in 2.22-8.
>>>>
>>>> e.g.:
>>>> In 2.20.1-16:
>>>> # g++ -ffunction-sections -fdata-sections -rdynamic -Wl,--gc-sections
>>>> t.cpp
>>>> #
>>>>
>>>> In 2.22-8:
>>>> # g++ -ffunction-sections -fdata-sections -rdynamic -Wl,--gc-sections
>>>> t.cpp
>>>> /tmp/ccU6re3d.o: In function `c1_type::c1_func1()':
>>>> t.cpp:(.text._ZN7c1_type8c1_func1Ev+0x12): undefined reference to
>>>> `c1_type::int_1'
>>>> t.cpp:(.text._ZN7c1_type8c1_func1Ev+0x1e): undefined reference to
>>>> `c1_type::int_1'
>>>> collect2: ld returned 1 exit status
>>>>
>>>> Problem:
>>>> The unused code is supposed to be stripped of by -Wl,--gc-sections. When
>>>> used alone it works as expected. All the same when paied with ïrdynamic
>>>> the
>>>> build fails in the newer version.
>>>>
>>>> Would appreciate any opinions if this is a bug or if I'm missing
>>>> anything.
>>>>
>>>> Warm Rgds,
>>>> Makarand.
>>>>
>>>> System configuration:
>>>> # uname -a
>>>> Linux makarandpradhan-ppc 3.2.0-0.bpo.4-powerpc64 #1 SMP Debian
>>>> 3.2.41-2+deb7u2~bpo60+1 ppc GNU/Linux # cat /etc/*release
>>>> PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
>>>> NAME="Debian GNU/Linux"
>>>> VERSION_ID="7"
>>>> VERSION="7 (wheezy)"
>>>> ID=debian
>>>> ANSI_COLOR="1;31"
>>>> HOME_URL="http://www.debian.org/"
>>>> SUPPORT_URL="http://www.debian.org/support/"
>>>> BUG_REPORT_URL="http://bugs.debian.org/"
>>>>
>>>>
>>>> File: t.cpp
>>>> #include<stdio.h>
>>>>
>>>> class c1_type
>>>> {
>>>> public:
>>>> static int int_1;
>>>>
>>>> void c1_func1(void);
>>>> };
>>>>
>>>> void c1_type::c1_func1()
>>>> {
>>>> int_1 = 25;
>>>> }
>>>>
>>>> int main()
>>>> {
>>>> return 0;
>>>> }
>>>>
>>> This regression is caused by
>>>
>>> https://sourceware.org/ml/binutils/2011-11/msg00056.html
>>>
>> I think your code is invalid. You need either to provide definition
>> for
>>
>> static int int_1;
>>
>> or drop -rdynamic.
>
>
> Hi H.J. Lu,
>
> Appreciate your replies.
>
> The definition is intentionally dropped so that it is stripped by
> -Wl,--gc-sections. Only when used in conjunction with -rdynamic it causes a
> problem.
>
> I could successfully use both -Wl,--gc-sections and -rdynamic in 2.20.1-16
> but it fails in 2.22-8.
>
> That's why I was wondering if any commit has caused this change. And if this
> is intentional or a bug.
>
>
-rdynamic tells linker to make ALL global symbols available for
dynamic linking, including those unused. You have
void c1_type::c1_func1()
{
int_1 = 25;
}
Linker will export it even if --gc-sections is used. When -rdynamic
is used, --gc-sections will only discard unused LOCAL symbols.
This is the bug fixed in binutils 2.21.
--
H.J.