Why don't Unix/Linux systems traverse through directories until they find the required version of a linked library? The 2019 Stack Overflow Developer Survey Results Are InConfusion about linking boost library while compilationIs it possible to configure dynamic loader for an executableI am getting an error while loading shared libraries libXm.so.3Satisfying lib dependencyError while building snipersim: “relocation R_X86_64_32S against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC”How do I find the libraries this program needs for its environment variable?How to regain access to the lost user , linux3 , of two side by side Ubuntu 16.04 instances?Where do C# executables running on an Ubuntu Linux 16.04 desktop which use source code that DLLImport's shared objects look for them at runtime?Cannot find shared object file even though it's in library pathPlaced library in /usr/lib, but ldconfig doesn't put it in cache

Limit the amount of RAM Mathematica may access?

What do the Banks children have against barley water?

How was Skylab's orbit inclination chosen?

Is three citations per paragraph excessive for undergraduate research paper?

aging parents with no investments

Could JWST stay at L2 "forever"?

Families of ordered set partitions with disjoint blocks

Unbreakable Formation vs. Cry of the Carnarium

I looked up a future colleague on linkedin before I started a job. I told my colleague about it and he seemed surprised. Should I apologize?

Is the gradient of the self-intersections of a curve zero?

How to manage monthly salary

What is this 4-propeller plane?

What does "rabbited" mean/imply in this sentence?

Why is Grand Jury testimony secret?

Did USCIS resume its biometric service for UK visa?

is usb on wall sockets live all the time with out switches off

How are circuits which use complex ICs normally simulated?

Can't find the latex code for the ⍎ (down tack jot) symbol

I see my dog run

Evaluating number of iteration with a certain map with While

Spanish for "widget"

Springs with some finite mass

Where to refill my bottle in India?

Why don't Unix/Linux systems traverse through directories until they find the required version of a linked library?



Why don't Unix/Linux systems traverse through directories until they find the required version of a linked library?



The 2019 Stack Overflow Developer Survey Results Are InConfusion about linking boost library while compilationIs it possible to configure dynamic loader for an executableI am getting an error while loading shared libraries libXm.so.3Satisfying lib dependencyError while building snipersim: “relocation R_X86_64_32S against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC”How do I find the libraries this program needs for its environment variable?How to regain access to the lost user , linux3 , of two side by side Ubuntu 16.04 instances?Where do C# executables running on an Ubuntu Linux 16.04 desktop which use source code that DLLImport's shared objects look for them at runtime?Cannot find shared object file even though it's in library pathPlaced library in /usr/lib, but ldconfig doesn't put it in cache



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








13















I have a binary executable named "alpha" that requires a linked library (libz.so.1.2.7) which is placed at /home/username/myproduct/lib/libz.so.1.2.7



I export the same to my terminal instance before spawning my binary executable by executing the following command.



export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH


Now, when I spawn another application "bravo" that requires the same library but of different version, i.e (libz.so.1.2.8) which is available in
/lib/x86_64-linux-gnu/libz.so.1.2.8, system throws the following error.



version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)


If I unset the LD_LIBRARY_PATH, "bravo" starts up fine. I understand that the above behaviour is because LD_LIBRARY_PATH takes precedence over the directory paths defined in /etc/ld.so.conf while looking for linked libraries and consequently the above error occurred. I am just curious about why have not the developers of UNIX/LINUX designed the OS to search for linked libraries in other directories according to the hierarchy if the first instance of library is of different version.



Simply put, UNIX/LINUX systems traverse through a set of directories until it finds the required library. But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?










share|improve this question









New contributor




daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















  • I'm not quite sure, but I'd guess for security. I personally would rather not have to worry about a sym-link anywhere on my machines

    – Joe
    15 hours ago











  • @Joe Many of the libraries themselves have symlinks pointing to them. libz.so.1 is a symlink to libz.so.1.2.8

    – Nasir Riley
    15 hours ago

















13















I have a binary executable named "alpha" that requires a linked library (libz.so.1.2.7) which is placed at /home/username/myproduct/lib/libz.so.1.2.7



I export the same to my terminal instance before spawning my binary executable by executing the following command.



export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH


Now, when I spawn another application "bravo" that requires the same library but of different version, i.e (libz.so.1.2.8) which is available in
/lib/x86_64-linux-gnu/libz.so.1.2.8, system throws the following error.



version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)


If I unset the LD_LIBRARY_PATH, "bravo" starts up fine. I understand that the above behaviour is because LD_LIBRARY_PATH takes precedence over the directory paths defined in /etc/ld.so.conf while looking for linked libraries and consequently the above error occurred. I am just curious about why have not the developers of UNIX/LINUX designed the OS to search for linked libraries in other directories according to the hierarchy if the first instance of library is of different version.



Simply put, UNIX/LINUX systems traverse through a set of directories until it finds the required library. But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?










share|improve this question









New contributor




daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















  • I'm not quite sure, but I'd guess for security. I personally would rather not have to worry about a sym-link anywhere on my machines

    – Joe
    15 hours ago











  • @Joe Many of the libraries themselves have symlinks pointing to them. libz.so.1 is a symlink to libz.so.1.2.8

    – Nasir Riley
    15 hours ago













13












13








13


1






I have a binary executable named "alpha" that requires a linked library (libz.so.1.2.7) which is placed at /home/username/myproduct/lib/libz.so.1.2.7



I export the same to my terminal instance before spawning my binary executable by executing the following command.



export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH


Now, when I spawn another application "bravo" that requires the same library but of different version, i.e (libz.so.1.2.8) which is available in
/lib/x86_64-linux-gnu/libz.so.1.2.8, system throws the following error.



version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)


If I unset the LD_LIBRARY_PATH, "bravo" starts up fine. I understand that the above behaviour is because LD_LIBRARY_PATH takes precedence over the directory paths defined in /etc/ld.so.conf while looking for linked libraries and consequently the above error occurred. I am just curious about why have not the developers of UNIX/LINUX designed the OS to search for linked libraries in other directories according to the hierarchy if the first instance of library is of different version.



Simply put, UNIX/LINUX systems traverse through a set of directories until it finds the required library. But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?










share|improve this question









New contributor




daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












I have a binary executable named "alpha" that requires a linked library (libz.so.1.2.7) which is placed at /home/username/myproduct/lib/libz.so.1.2.7



I export the same to my terminal instance before spawning my binary executable by executing the following command.



export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH


Now, when I spawn another application "bravo" that requires the same library but of different version, i.e (libz.so.1.2.8) which is available in
/lib/x86_64-linux-gnu/libz.so.1.2.8, system throws the following error.



version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)


If I unset the LD_LIBRARY_PATH, "bravo" starts up fine. I understand that the above behaviour is because LD_LIBRARY_PATH takes precedence over the directory paths defined in /etc/ld.so.conf while looking for linked libraries and consequently the above error occurred. I am just curious about why have not the developers of UNIX/LINUX designed the OS to search for linked libraries in other directories according to the hierarchy if the first instance of library is of different version.



Simply put, UNIX/LINUX systems traverse through a set of directories until it finds the required library. But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?







libraries dynamic-linking shared-library ld






share|improve this question









New contributor




daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 11 hours ago









Stephen Kitt

180k25412492




180k25412492






New contributor




daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 15 hours ago









daedalus_hamletdaedalus_hamlet

715




715




New contributor




daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






daedalus_hamlet is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












  • I'm not quite sure, but I'd guess for security. I personally would rather not have to worry about a sym-link anywhere on my machines

    – Joe
    15 hours ago











  • @Joe Many of the libraries themselves have symlinks pointing to them. libz.so.1 is a symlink to libz.so.1.2.8

    – Nasir Riley
    15 hours ago

















  • I'm not quite sure, but I'd guess for security. I personally would rather not have to worry about a sym-link anywhere on my machines

    – Joe
    15 hours ago











  • @Joe Many of the libraries themselves have symlinks pointing to them. libz.so.1 is a symlink to libz.so.1.2.8

    – Nasir Riley
    15 hours ago
















I'm not quite sure, but I'd guess for security. I personally would rather not have to worry about a sym-link anywhere on my machines

– Joe
15 hours ago





I'm not quite sure, but I'd guess for security. I personally would rather not have to worry about a sym-link anywhere on my machines

– Joe
15 hours ago













@Joe Many of the libraries themselves have symlinks pointing to them. libz.so.1 is a symlink to libz.so.1.2.8

– Nasir Riley
15 hours ago





@Joe Many of the libraries themselves have symlinks pointing to them. libz.so.1 is a symlink to libz.so.1.2.8

– Nasir Riley
15 hours ago










1 Answer
1






active

oldest

votes


















21















But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?




It does, as far as it’s aware. zlib.so.1.2.7 and zlib.so.1.2.8 both have an soname of zlib.so.1, so your alpha and bravo binaries say they need zlib.so.1. The dynamic loader loads the first matching library it finds; it doesn’t know that version 1.2.8 provides additional symbols which bravo needs. (This is why distributions take pains to specify additional dependency information, such as zlib1g (>= 1.2.8) for bravo.)



You might think this should be easy to fix, but it isn’t, not least because binaries and libraries list the symbols they need separately from the libraries they need, so the loader can’t check that a given library provides all the symbols that are needed from it. Symbols can be provided in a variety of ways, and introducing a link between symbols and the libraries providing them could break existing binaries. There’s also the added fun of symbol interposition to complicate things (and make security-sensitive developers tear their hair out).



Some libraries provide version information which ends up being stored in .gnu.version_r, with a link to the providing library, which would help here, but libz isn’t one of them.



(Given the sonames, I’d expect your alpha binary to work fine with zlib.so.1.2.8.)






share|improve this answer

























  • And one should note as well that GNU-style library versioning is different from the semantic(-ish) versioning with which we are most accustomed. Since they have the same "current" number, 1, zlib.so.1.2.8 should not provide any features that zlib.so.1.2.7 does not, hence it ought not to matter (from an ABI perspective) which one is found. That it does matter should be considered a flaw.

    – John Bollinger
    6 hours ago







  • 1





    @John no, the only guarantee is that libraries with the same soname are backwards-compatible; newer libraries can add features, they can’t remove any or change any in a backwards-incompatible fashion. That is to say, a binary built against zlib 1.2.7 will work with that or any newer zlib 1; but a binary built against zlib 1.2.8 won’t necessarily work with an older zlib 1. (And semantic versioning allows that; but soname handling isn’t semantic versioning.)

    – Stephen Kitt
    6 hours ago












  • I'm talking specifically about GNU conventions, as I said, and I guess about libtool in particular. Not every project follows that convention, so perhaps it's too strong to call zlib flawed, but on the other hand, even a semantic-versioning interpretation of the library version numbers involved would come to the same conclusion. Forwards (binary) compatibility in such cases is not a promise inherent in the soname, but it is a reasonable expectation in this case.

    – John Bollinger
    6 hours ago












  • @John I understood that, but you can’t interpret the first number in the soname as libtool’s “current” number in its CRA system. And semantic versioning only requires that you increment the second value when adding features; so technically, yes, zlib gets this wrong and should have gone from 1.2.7 to 1.3.0, but not to 2.0.0 and keeping the same soname is fine even from a semantic perspective (IMO).

    – Stephen Kitt
    6 hours ago







  • 1





    @John right, I suspect we’re in violent agreement and that I misunderstood the point you were making. zlib doesn’t use libtool anyway, except on Darwin where it’s ar ;-).

    – Stephen Kitt
    5 hours ago











Your Answer








StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);






daedalus_hamlet is a new contributor. Be nice, and check out our Code of Conduct.









draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f511380%2fwhy-dont-unix-linux-systems-traverse-through-directories-until-they-find-the-re%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









21















But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?




It does, as far as it’s aware. zlib.so.1.2.7 and zlib.so.1.2.8 both have an soname of zlib.so.1, so your alpha and bravo binaries say they need zlib.so.1. The dynamic loader loads the first matching library it finds; it doesn’t know that version 1.2.8 provides additional symbols which bravo needs. (This is why distributions take pains to specify additional dependency information, such as zlib1g (>= 1.2.8) for bravo.)



You might think this should be easy to fix, but it isn’t, not least because binaries and libraries list the symbols they need separately from the libraries they need, so the loader can’t check that a given library provides all the symbols that are needed from it. Symbols can be provided in a variety of ways, and introducing a link between symbols and the libraries providing them could break existing binaries. There’s also the added fun of symbol interposition to complicate things (and make security-sensitive developers tear their hair out).



Some libraries provide version information which ends up being stored in .gnu.version_r, with a link to the providing library, which would help here, but libz isn’t one of them.



(Given the sonames, I’d expect your alpha binary to work fine with zlib.so.1.2.8.)






share|improve this answer

























  • And one should note as well that GNU-style library versioning is different from the semantic(-ish) versioning with which we are most accustomed. Since they have the same "current" number, 1, zlib.so.1.2.8 should not provide any features that zlib.so.1.2.7 does not, hence it ought not to matter (from an ABI perspective) which one is found. That it does matter should be considered a flaw.

    – John Bollinger
    6 hours ago







  • 1





    @John no, the only guarantee is that libraries with the same soname are backwards-compatible; newer libraries can add features, they can’t remove any or change any in a backwards-incompatible fashion. That is to say, a binary built against zlib 1.2.7 will work with that or any newer zlib 1; but a binary built against zlib 1.2.8 won’t necessarily work with an older zlib 1. (And semantic versioning allows that; but soname handling isn’t semantic versioning.)

    – Stephen Kitt
    6 hours ago












  • I'm talking specifically about GNU conventions, as I said, and I guess about libtool in particular. Not every project follows that convention, so perhaps it's too strong to call zlib flawed, but on the other hand, even a semantic-versioning interpretation of the library version numbers involved would come to the same conclusion. Forwards (binary) compatibility in such cases is not a promise inherent in the soname, but it is a reasonable expectation in this case.

    – John Bollinger
    6 hours ago












  • @John I understood that, but you can’t interpret the first number in the soname as libtool’s “current” number in its CRA system. And semantic versioning only requires that you increment the second value when adding features; so technically, yes, zlib gets this wrong and should have gone from 1.2.7 to 1.3.0, but not to 2.0.0 and keeping the same soname is fine even from a semantic perspective (IMO).

    – Stephen Kitt
    6 hours ago







  • 1





    @John right, I suspect we’re in violent agreement and that I misunderstood the point you were making. zlib doesn’t use libtool anyway, except on Darwin where it’s ar ;-).

    – Stephen Kitt
    5 hours ago















21















But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?




It does, as far as it’s aware. zlib.so.1.2.7 and zlib.so.1.2.8 both have an soname of zlib.so.1, so your alpha and bravo binaries say they need zlib.so.1. The dynamic loader loads the first matching library it finds; it doesn’t know that version 1.2.8 provides additional symbols which bravo needs. (This is why distributions take pains to specify additional dependency information, such as zlib1g (>= 1.2.8) for bravo.)



You might think this should be easy to fix, but it isn’t, not least because binaries and libraries list the symbols they need separately from the libraries they need, so the loader can’t check that a given library provides all the symbols that are needed from it. Symbols can be provided in a variety of ways, and introducing a link between symbols and the libraries providing them could break existing binaries. There’s also the added fun of symbol interposition to complicate things (and make security-sensitive developers tear their hair out).



Some libraries provide version information which ends up being stored in .gnu.version_r, with a link to the providing library, which would help here, but libz isn’t one of them.



(Given the sonames, I’d expect your alpha binary to work fine with zlib.so.1.2.8.)






share|improve this answer

























  • And one should note as well that GNU-style library versioning is different from the semantic(-ish) versioning with which we are most accustomed. Since they have the same "current" number, 1, zlib.so.1.2.8 should not provide any features that zlib.so.1.2.7 does not, hence it ought not to matter (from an ABI perspective) which one is found. That it does matter should be considered a flaw.

    – John Bollinger
    6 hours ago







  • 1





    @John no, the only guarantee is that libraries with the same soname are backwards-compatible; newer libraries can add features, they can’t remove any or change any in a backwards-incompatible fashion. That is to say, a binary built against zlib 1.2.7 will work with that or any newer zlib 1; but a binary built against zlib 1.2.8 won’t necessarily work with an older zlib 1. (And semantic versioning allows that; but soname handling isn’t semantic versioning.)

    – Stephen Kitt
    6 hours ago












  • I'm talking specifically about GNU conventions, as I said, and I guess about libtool in particular. Not every project follows that convention, so perhaps it's too strong to call zlib flawed, but on the other hand, even a semantic-versioning interpretation of the library version numbers involved would come to the same conclusion. Forwards (binary) compatibility in such cases is not a promise inherent in the soname, but it is a reasonable expectation in this case.

    – John Bollinger
    6 hours ago












  • @John I understood that, but you can’t interpret the first number in the soname as libtool’s “current” number in its CRA system. And semantic versioning only requires that you increment the second value when adding features; so technically, yes, zlib gets this wrong and should have gone from 1.2.7 to 1.3.0, but not to 2.0.0 and keeping the same soname is fine even from a semantic perspective (IMO).

    – Stephen Kitt
    6 hours ago







  • 1





    @John right, I suspect we’re in violent agreement and that I misunderstood the point you were making. zlib doesn’t use libtool anyway, except on Darwin where it’s ar ;-).

    – Stephen Kitt
    5 hours ago













21












21








21








But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?




It does, as far as it’s aware. zlib.so.1.2.7 and zlib.so.1.2.8 both have an soname of zlib.so.1, so your alpha and bravo binaries say they need zlib.so.1. The dynamic loader loads the first matching library it finds; it doesn’t know that version 1.2.8 provides additional symbols which bravo needs. (This is why distributions take pains to specify additional dependency information, such as zlib1g (>= 1.2.8) for bravo.)



You might think this should be easy to fix, but it isn’t, not least because binaries and libraries list the symbols they need separately from the libraries they need, so the loader can’t check that a given library provides all the symbols that are needed from it. Symbols can be provided in a variety of ways, and introducing a link between symbols and the libraries providing them could break existing binaries. There’s also the added fun of symbol interposition to complicate things (and make security-sensitive developers tear their hair out).



Some libraries provide version information which ends up being stored in .gnu.version_r, with a link to the providing library, which would help here, but libz isn’t one of them.



(Given the sonames, I’d expect your alpha binary to work fine with zlib.so.1.2.8.)






share|improve this answer
















But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?




It does, as far as it’s aware. zlib.so.1.2.7 and zlib.so.1.2.8 both have an soname of zlib.so.1, so your alpha and bravo binaries say they need zlib.so.1. The dynamic loader loads the first matching library it finds; it doesn’t know that version 1.2.8 provides additional symbols which bravo needs. (This is why distributions take pains to specify additional dependency information, such as zlib1g (>= 1.2.8) for bravo.)



You might think this should be easy to fix, but it isn’t, not least because binaries and libraries list the symbols they need separately from the libraries they need, so the loader can’t check that a given library provides all the symbols that are needed from it. Symbols can be provided in a variety of ways, and introducing a link between symbols and the libraries providing them could break existing binaries. There’s also the added fun of symbol interposition to complicate things (and make security-sensitive developers tear their hair out).



Some libraries provide version information which ends up being stored in .gnu.version_r, with a link to the providing library, which would help here, but libz isn’t one of them.



(Given the sonames, I’d expect your alpha binary to work fine with zlib.so.1.2.8.)







share|improve this answer














share|improve this answer



share|improve this answer








edited 15 hours ago

























answered 15 hours ago









Stephen KittStephen Kitt

180k25412492




180k25412492












  • And one should note as well that GNU-style library versioning is different from the semantic(-ish) versioning with which we are most accustomed. Since they have the same "current" number, 1, zlib.so.1.2.8 should not provide any features that zlib.so.1.2.7 does not, hence it ought not to matter (from an ABI perspective) which one is found. That it does matter should be considered a flaw.

    – John Bollinger
    6 hours ago







  • 1





    @John no, the only guarantee is that libraries with the same soname are backwards-compatible; newer libraries can add features, they can’t remove any or change any in a backwards-incompatible fashion. That is to say, a binary built against zlib 1.2.7 will work with that or any newer zlib 1; but a binary built against zlib 1.2.8 won’t necessarily work with an older zlib 1. (And semantic versioning allows that; but soname handling isn’t semantic versioning.)

    – Stephen Kitt
    6 hours ago












  • I'm talking specifically about GNU conventions, as I said, and I guess about libtool in particular. Not every project follows that convention, so perhaps it's too strong to call zlib flawed, but on the other hand, even a semantic-versioning interpretation of the library version numbers involved would come to the same conclusion. Forwards (binary) compatibility in such cases is not a promise inherent in the soname, but it is a reasonable expectation in this case.

    – John Bollinger
    6 hours ago












  • @John I understood that, but you can’t interpret the first number in the soname as libtool’s “current” number in its CRA system. And semantic versioning only requires that you increment the second value when adding features; so technically, yes, zlib gets this wrong and should have gone from 1.2.7 to 1.3.0, but not to 2.0.0 and keeping the same soname is fine even from a semantic perspective (IMO).

    – Stephen Kitt
    6 hours ago







  • 1





    @John right, I suspect we’re in violent agreement and that I misunderstood the point you were making. zlib doesn’t use libtool anyway, except on Darwin where it’s ar ;-).

    – Stephen Kitt
    5 hours ago

















  • And one should note as well that GNU-style library versioning is different from the semantic(-ish) versioning with which we are most accustomed. Since they have the same "current" number, 1, zlib.so.1.2.8 should not provide any features that zlib.so.1.2.7 does not, hence it ought not to matter (from an ABI perspective) which one is found. That it does matter should be considered a flaw.

    – John Bollinger
    6 hours ago







  • 1





    @John no, the only guarantee is that libraries with the same soname are backwards-compatible; newer libraries can add features, they can’t remove any or change any in a backwards-incompatible fashion. That is to say, a binary built against zlib 1.2.7 will work with that or any newer zlib 1; but a binary built against zlib 1.2.8 won’t necessarily work with an older zlib 1. (And semantic versioning allows that; but soname handling isn’t semantic versioning.)

    – Stephen Kitt
    6 hours ago












  • I'm talking specifically about GNU conventions, as I said, and I guess about libtool in particular. Not every project follows that convention, so perhaps it's too strong to call zlib flawed, but on the other hand, even a semantic-versioning interpretation of the library version numbers involved would come to the same conclusion. Forwards (binary) compatibility in such cases is not a promise inherent in the soname, but it is a reasonable expectation in this case.

    – John Bollinger
    6 hours ago












  • @John I understood that, but you can’t interpret the first number in the soname as libtool’s “current” number in its CRA system. And semantic versioning only requires that you increment the second value when adding features; so technically, yes, zlib gets this wrong and should have gone from 1.2.7 to 1.3.0, but not to 2.0.0 and keeping the same soname is fine even from a semantic perspective (IMO).

    – Stephen Kitt
    6 hours ago







  • 1





    @John right, I suspect we’re in violent agreement and that I misunderstood the point you were making. zlib doesn’t use libtool anyway, except on Darwin where it’s ar ;-).

    – Stephen Kitt
    5 hours ago
















And one should note as well that GNU-style library versioning is different from the semantic(-ish) versioning with which we are most accustomed. Since they have the same "current" number, 1, zlib.so.1.2.8 should not provide any features that zlib.so.1.2.7 does not, hence it ought not to matter (from an ABI perspective) which one is found. That it does matter should be considered a flaw.

– John Bollinger
6 hours ago






And one should note as well that GNU-style library versioning is different from the semantic(-ish) versioning with which we are most accustomed. Since they have the same "current" number, 1, zlib.so.1.2.8 should not provide any features that zlib.so.1.2.7 does not, hence it ought not to matter (from an ABI perspective) which one is found. That it does matter should be considered a flaw.

– John Bollinger
6 hours ago





1




1





@John no, the only guarantee is that libraries with the same soname are backwards-compatible; newer libraries can add features, they can’t remove any or change any in a backwards-incompatible fashion. That is to say, a binary built against zlib 1.2.7 will work with that or any newer zlib 1; but a binary built against zlib 1.2.8 won’t necessarily work with an older zlib 1. (And semantic versioning allows that; but soname handling isn’t semantic versioning.)

– Stephen Kitt
6 hours ago






@John no, the only guarantee is that libraries with the same soname are backwards-compatible; newer libraries can add features, they can’t remove any or change any in a backwards-incompatible fashion. That is to say, a binary built against zlib 1.2.7 will work with that or any newer zlib 1; but a binary built against zlib 1.2.8 won’t necessarily work with an older zlib 1. (And semantic versioning allows that; but soname handling isn’t semantic versioning.)

– Stephen Kitt
6 hours ago














I'm talking specifically about GNU conventions, as I said, and I guess about libtool in particular. Not every project follows that convention, so perhaps it's too strong to call zlib flawed, but on the other hand, even a semantic-versioning interpretation of the library version numbers involved would come to the same conclusion. Forwards (binary) compatibility in such cases is not a promise inherent in the soname, but it is a reasonable expectation in this case.

– John Bollinger
6 hours ago






I'm talking specifically about GNU conventions, as I said, and I guess about libtool in particular. Not every project follows that convention, so perhaps it's too strong to call zlib flawed, but on the other hand, even a semantic-versioning interpretation of the library version numbers involved would come to the same conclusion. Forwards (binary) compatibility in such cases is not a promise inherent in the soname, but it is a reasonable expectation in this case.

– John Bollinger
6 hours ago














@John I understood that, but you can’t interpret the first number in the soname as libtool’s “current” number in its CRA system. And semantic versioning only requires that you increment the second value when adding features; so technically, yes, zlib gets this wrong and should have gone from 1.2.7 to 1.3.0, but not to 2.0.0 and keeping the same soname is fine even from a semantic perspective (IMO).

– Stephen Kitt
6 hours ago






@John I understood that, but you can’t interpret the first number in the soname as libtool’s “current” number in its CRA system. And semantic versioning only requires that you increment the second value when adding features; so technically, yes, zlib gets this wrong and should have gone from 1.2.7 to 1.3.0, but not to 2.0.0 and keeping the same soname is fine even from a semantic perspective (IMO).

– Stephen Kitt
6 hours ago





1




1





@John right, I suspect we’re in violent agreement and that I misunderstood the point you were making. zlib doesn’t use libtool anyway, except on Darwin where it’s ar ;-).

– Stephen Kitt
5 hours ago





@John right, I suspect we’re in violent agreement and that I misunderstood the point you were making. zlib doesn’t use libtool anyway, except on Darwin where it’s ar ;-).

– Stephen Kitt
5 hours ago










daedalus_hamlet is a new contributor. Be nice, and check out our Code of Conduct.









draft saved

draft discarded


















daedalus_hamlet is a new contributor. Be nice, and check out our Code of Conduct.












daedalus_hamlet is a new contributor. Be nice, and check out our Code of Conduct.











daedalus_hamlet is a new contributor. Be nice, and check out our Code of Conduct.














Thanks for contributing an answer to Unix & Linux Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f511380%2fwhy-dont-unix-linux-systems-traverse-through-directories-until-they-find-the-re%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Ружовы пелікан Змест Знешні выгляд | Пашырэнне | Асаблівасці біялогіі | Літаратура | НавігацыяДагледжаная версіяправерана1 зменаДагледжаная версіяправерана1 змена/ 22697590 Сістэматыкана ВіківідахВыявына Вікісховішчы174693363011049382

ValueError: Error when checking input: expected conv2d_13_input to have shape (3, 150, 150) but got array with shape (150, 150, 3)2019 Community Moderator ElectionError when checking : expected dense_1_input to have shape (None, 5) but got array with shape (200, 1)Error 'Expected 2D array, got 1D array instead:'ValueError: Error when checking input: expected lstm_41_input to have 3 dimensions, but got array with shape (40000,100)ValueError: Error when checking target: expected dense_1 to have shape (7,) but got array with shape (1,)ValueError: Error when checking target: expected dense_2 to have shape (1,) but got array with shape (0,)Keras exception: ValueError: Error when checking input: expected conv2d_1_input to have shape (150, 150, 3) but got array with shape (256, 256, 3)Steps taking too long to completewhen checking input: expected dense_1_input to have shape (13328,) but got array with shape (317,)ValueError: Error when checking target: expected dense_3 to have shape (None, 1) but got array with shape (7715, 40000)Keras exception: Error when checking input: expected dense_input to have shape (2,) but got array with shape (1,)

Illegal assignment from SObject to ContactFetching String, Id from Map - Illegal Assignment Id to Field / ObjectError: Compile Error: Illegal assignment from String to BooleanError: List has no rows for assignment to SObjectError on Test Class - System.QueryException: List has no rows for assignment to SObjectRemote action problemDML requires SObject or SObject list type error“Illegal assignment from List to List”Test Class Fail: Batch Class: System.QueryException: List has no rows for assignment to SObjectMapping to a user'List has no rows for assignment to SObject' Mystery