[PATCH] build: fix linker warnings about undefined symbols

David Marchand david.marchand at redhat.com
Mon Jan 15 09:56:45 CET 2024


On Fri, Jan 12, 2024 at 9:49 PM Morten Brørup <mb at smartsharesystems.com> wrote:
> > you can use symver in combination with visibility default
> >
> > https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
> >
> > anyway just food for thought, it would get me out of having to hack &
> > enhance the .def from .map generation and unfortunately even with that
> > there are going to be cases where i still have to annotate the actual
> > symbol export in code (for windows).

Versioning a symbol means you are exporting it, is it not that simple?
So I don't see the need for annotating about symbol visibility.


> >
> > just thought a more unified approach for all might appeal.
>
> Assuming that we truly want DPDK to support Windows, a more unified approach is a reasonable ask.
>
> If we can eliminate the technical obstacles, we should pursue it.

IIUC, we still need a "default" version script, as the linker needs
one to declare version nodes, and so we have a catch all for
unversioned symbols.

$ cat symver.c
__attribute__ ((__symver__ ("api1 at DPDK_23")))
int old_api1(void) { return 0; }

__attribute__ ((__symver__ ("api1@@DPDK_24")))
int api1(void) { return 0; }

__attribute__ ((__symver__ ("api2@@DPDK_24")))
int api2(void) { return 0; }

int api3(void) { return 0; }

$ cat symver.map
DPDK_23 { };
DPDK_24 { };
EXPERIMENTAL { };
INTERNAL {
    local: *;
};

$ gcc -o symver.o -fPIC -Wall -Werror -c symver.c && gcc -o
libsymver.so -shared -fPIC -Wl,--version-script symver.map symver.o &&
readelf -s libsymver.so | grep api
     5: 0000000000001104    11 FUNC    GLOBAL DEFAULT   13 api1@@DPDK_24
     7: 00000000000010f9    11 FUNC    GLOBAL DEFAULT   13 api1 at DPDK_23
     9: 000000000000110f    11 FUNC    GLOBAL DEFAULT   13 api2@@DPDK_24
    13: 00000000000010f9    11 FUNC    LOCAL  DEFAULT   13 old_api1
    15: 0000000000001104    11 FUNC    LOCAL  DEFAULT   13 api1
    16: 000000000000111a    11 FUNC    LOCAL  DEFAULT   13 api3
    19: 000000000000110f    11 FUNC    LOCAL  DEFAULT   13 api2
    24: 0000000000001104    11 FUNC    GLOBAL DEFAULT   13 api1@@DPDK_24
    29: 00000000000010f9    11 FUNC    GLOBAL DEFAULT   13 api1 at DPDK_23
    31: 000000000000110f    11 FUNC    GLOBAL DEFAULT   13 api2@@DPDK_24


>
> We may have to sacrifice some "nice to have" advantages of the version.map files along the way, such as having easy access to the list of experimental functions in the version.map file.

Developers lose the single location for versioning information, but we
already have some scripts to help list symbols from a given version.
We may have to enhance them.
But I don't think we would lose features.

The devil is probably in the details, though :-).


-- 
David Marchand



More information about the dev mailing list