Re: [PATCH] man3/dlopen.3: Describe confusing dladdr() behavior

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

 



Hi Petr,

Thanks for checking the patch.

On Sat, Dec 6, 2008 at 5:01 AM, Petr Baudis <pasky@xxxxxxx> wrote:
> Hi!
>
> On Fri, Dec 05, 2008 at 05:50:25PM -0500, Michael Kerrisk wrote:
>> On Thu, Dec 4, 2008 at 9:44 PM, Petr Baudis <pasky@xxxxxxx> wrote:
>> > +section of the original object (which dispatches the call after
>> > +asking the dynamic linker to resolve the symbol).
>> > +To work this around, you can try to compile the code to be
>> > +position-independent:
>>
>> I added: "gcc -fPIC" here
>
> Sometimes, -fpic might be better idea, for executables -fpie or -fPIE is
> better choice, which is why I chose not to mention a particular switch.
> It should be easy to look that up in the gcc manual page and you should
> understand the implications of this choice before doing it anyway.

Fair enough.  I removed "gcc -fPIC".

>> > then, the compiler cannot prepare the pointer
>> > +at the compile time anymore and today's gcc will just load
>>
>> I made it "gcc(1)", but this doesn't seem quite right.  It's not gcc
>> in operation at program run time.  can you more precisely say what you
>> mean here.
>
> What about "code generated by today's gcc"?

Yep, i made it something like that.

> (I don't know if gcc always
> behaved like that or what do other compilers do, and I'm not willing to
> do the research in this case.)
>
> On Fri, Dec 05, 2008 at 05:55:28PM -0500, Michael Kerrisk wrote:
>> @@ -414,6 +415,34 @@ That system also has
>>  .BR dladdr (),
>>  but not
>>  .BR dlvsym ().
>> +.SH BUGS
>> +Sometimes, the function pointers you pass to
>> +.BR dladdr ()
>> +may surprise you.
>> +On some architectures (notably i386 and x86_64),
>> +.I dli_fname
>> +and
>> +.I dli_fbase
>> +may end up pointing back at the object from which you called
>> +.BR dladdr (),
>> +even if the function used as an argument should come from
>> +a dynamically linked library.
>> +.PP
>> +The problem is that the function pointer will still be resolved
>> +at compile time, but merely point to the
>> +.I plt
>> +(procedure linkage table)
>
> The section name is "plt" but the expanded name should be capitalized,
> while...

Done.

>> +section of the original object (which dispatches the call after
>> +asking the dynamic linker to resolve the symbol).
>> +To work this around, you can try to compile the code to be
>> +position-independent
>> +.RI ( "cc -fPIC" ): then, the compiler cannot prepare the pointer
>> +at compile time anymore and today's
>> +.BR gcc (1)
>> +will just load the final symbol address from the
>> +.I GOT
>> +(Global Offset Table) at run time before passing it to
>
> ...here I guess either the acronym is not necessary or it should be
> "got" for consistency (the section name).

Done.

>> +.BR dladdr ().
>>  .SH EXAMPLE
>>  Load the math library, and print the cosine of 2.0:
>>  .nf

Below is the change for man-pages-3.16.

Cheers,

Michael

--- a/man3/dlopen.3
+++ b/man3/dlopen.3
@@ -32,7 +32,7 @@
 .\" Modified by Walter Harms: dladdr, dlvsym
 .\" Modified by Petr Baudis <pasky@xxxxxxx>, 2008-12-04: dladdr caveat
 .\"
-.TH DLOPEN 3 2008-12-05 "Linux" "Linux Programmer's Manual"
+.TH DLOPEN 3 2008-12-06 "Linux" "Linux Programmer's Manual"
 .SH NAME
 dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym \- programming interface to
 dynamic linking loader
@@ -431,17 +431,16 @@ a dynamically linked library.
 The problem is that the function pointer will still be resolved
 at compile time, but merely point to the
 .I plt
-(procedure linkage table)
+(Procedure Linkage Table)
 section of the original object (which dispatches the call after
 asking the dynamic linker to resolve the symbol).
-To work this around, you can try to compile the code to be
-position-independent
-.RI ( "cc -fPIC" ):
+To work around this,
+you can try to compile the code to be position-independent:
 then, the compiler cannot prepare the pointer
 at compile time anymore and today's
 .BR gcc (1)
-will just load the final symbol address from the
-.I GOT
+will generate code that just loads the final symbol address from the
+.I got
 (Global Offset Table) at run time before passing it to
 .BR dladdr ().
 .SH EXAMPLE
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux