Opened 15 months ago

Last modified 9 months ago

#14531 new bug

dlopen: program symbols override the one used by library

Reported by: leorize Owned by: nobody
Priority: high Milestone: Unscheduled
Component: - General Version: R1/Development
Keywords: Cc:
Blocked By: Blocking:
Has a Patch: no Platform: All

Description

The snippet attached below describe this problem.

How to run:

$ gcc -o dl dl.c
$ gcc -DLIBRARY -shared -o dl.so dl.c
$ LIBRARY_PATH="$PWD:$LIBRARY_PATH" ./dl

Expected:

from library

Got:

from program

The snippet has been tested on Linux, OpenBSD, FreeBSD and so far only Haiku exhibit this behavior.

Attachments (1)

dl.c (504 bytes ) - added by leorize 15 months ago.

Download all attachments as: .zip

Change History (11)

by leorize, 15 months ago

Attachment: dl.c added

comment:1 by leorize, 14 months ago

As a walkaround, the binary can be compiled with -fvisibility=hidden to get the desired behavior

comment:2 by leorize, 14 months ago

It's found that if the binary was compiled with -pie, we can get the desired behavior.

comment:3 by korli, 13 months ago

Priority: highnormal

comment:4 by waddlesplash, 13 months ago

Component: System/POSIXSystem/runtime_loader
Priority: normalhigh

You don't even need dlopen, this will happen with just regular shared libraries; and the symbols can even be "semi-hidden" as they are when a static library is linked into a regular library.

So this is a higher-priority issue, then.

comment:5 by jackburton, 13 months ago

Does this happen also on x64 or only or x86/gcc2 ?

comment:6 by waddlesplash, 13 months ago

Actually it happens on GCC7 only, GCC2 is unaffected. Further testing finds that this affects regular library loads, not just dlopen ones. E.g. a library can have a local function called calloc and then it will override the one from libroot. I'll attach a test binary later.

Adding -Xlinker -Bsymbolic to GCC7 linkspec fixes the issue. Why aren't we doing that already?

comment:7 by leorize, 13 months ago

It's a separate issue. Using -Bsymbolic does not solve the problem for dlopen(), only for linked libraries.

The linkspec of gcc2 is vastly different from gcc7, and I still haven't know why. I'll push a PR to adjust gcc7 linkspec later.

comment:8 by korli, 9 months ago

When using --export-dynamic Linux behaves the same as Haiku.

This isn't a bug in runtime_loader. Can we close this bug?

comment:9 by leorize, 9 months ago

On Linux and other *nix as well as Windows, we'd have to ask the linker to get this behavior. But on Haiku this is forced and can't be avoided without ill effects (crashing upon the use of TLS (haven't recheck since @waddlesplash fix), or have all symbols hidden). So I'd say we should not close this bug.

comment:10 by korli, 9 months ago

Component: System/runtime_loader- General
Note: See TracTickets for help on using tickets.