Skip to content

Conversation

AdamMajer
Copy link
Contributor

When built as a module instead of a shared library, the library is
no longer exporting an unversioned soname. Since this is library is
only meant to be dynamically loaded by the ODBC manager, the soname
is unused anyway.

objdump -x libmaodbc.so | grep SONAME

@lawrinn
Copy link
Collaborator

lawrinn commented Oct 12, 2020

Some people do link against odbc drivers directly to remove overhead introduced by a DM. Thus I don't want to remove SONAME export and inclined to reject this PR.

@AdamMajer
Copy link
Contributor Author

Hmmm, my instinct tells me that soname-less libraries have implicit "soname" equal to their filename. The soname is only used to write a different filename into the executable header than the filename from the linker. And I've just verified this. For example, a very simply test that uses a symbol from the library (wrongly, of course),

extern void SQLTables();

int main()
{
SQLTables();
return 0;
}

Will link with the library without explicit soname.

objdump -x a.out | grep NEEDED
  NEEDED               libmaodbc.so
  NEEDED               libc.so.6

So my commit message is incorrect. The explicit soname set to the filename (unversioned) is superfluous and unnecessary in all use-cases. You can also see this in the manpage of ld(1)

   -h name
   -soname=name
       When creating an ELF shared object, set the internal DT_SONAME field to the specified name.  
       When an executable is linked with a shared object which has a DT_SONAME field,
       then when the executable is run the dynamic linker will attempt to load the shared object specified 
       by the DT_SONAME field rather than the using the file name given to the linker.

@AdamMajer
Copy link
Contributor Author

I've corrected the commit message. For our packaging, the presence of a soname breaks some automatic packaging checks.

When built as a module instead of a shared library, the library is
no longer exporting an unversioned soname. Building the library with
an unversioned soname is superfluous as the linker will use the
filename for linking. The soname is only necessary when the library
linked during build has different filename than the library to be
used at runtime.
@lawrinn lawrinn force-pushed the master branch 11 times, most recently from bce19b5 to 86d602d Compare September 13, 2023 08:12
@lawrinn lawrinn force-pushed the master branch 2 times, most recently from 952f4bf to 1598057 Compare September 20, 2023 15:34
@lawrinn lawrinn force-pushed the master branch 7 times, most recently from f6d1ebc to d9b0c1d Compare November 28, 2024 11:11
@lawrinn lawrinn force-pushed the master branch 2 times, most recently from 6414b60 to 7942b8a Compare May 28, 2025 08:30
@lawrinn lawrinn force-pushed the master branch 6 times, most recently from f1286b9 to f84e1e4 Compare July 6, 2025 22:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants