Compared to the downsides of using a container image (duplication of system files like libc, dynamic linking overhead, complexity, etc), this is not a compelling advantage.
Also, if app going to execute some other binary with same dependency X
I mean, you could have GUI for some CLI tool. Then you would need to run binary GUI, and either run binary CLI from GUI or have it as daemon. Also, if you are going to make something that have more than one binary, you’ll get more space overhead for static linking than for containers
Compared to the downsides of using a container image (duplication of system files like libc, dynamic linking overhead, complexity, etc), this is not a compelling advantage.
Man, that’s underestimating compiling time and frequency of updates of various libs, and overestimating overhead from dynamic linking (it’s so small it’s calculated in CPU cycles). Basically, dynamic linking reduces update overhead, like with static linking you’ll need to download full binary every update, even if lib is tiny, while with dynamic you’ll have to download only small lib.
I wouldn’t expect them to have many libraries in common, other than platform libraries like libc, since they have completely different purposes.
I was under the impression that Docker is for server applications. Is it even possible to run a GUI app inside a Docker container?
Also, if you are going to make something that have more than one binary
If they’re meant to run on the same machine and are bundled together in the same container image, I would call that a questionable design choice.
Man, that’s underestimating compiling time and frequency of updates of various libs
Well, I have only my own experience to go on, but I am not usually bothered by compile times. I used to compile my own Linux kernels, for goodness’ sake. I would just leave it to do its thing and go do something else while I wait. Not a big deal.
Again, there are exceptions like Chromium, which take an obscenely long time to compile, but I assume we’re talking about something that takes minutes to compile, not hours or days.
and overestimating overhead from dynamic linking (it’s so small it’s calculated in CPU cycles).
No, I’m not. If you’re not using JIT compilation, the overhead of dynamic linking is severe, not because of how long it takes to call a dynamically-linked function (you’re right, that part is reasonably fast), but because inlining across a dynamic link is impossible, and inlining is, as matklad once put it, the mother of all other optimizations. Dynamic linking leaves potentially a lot of performance on the table.
This wasn’t the case before link-time optimization was a thing, mind you, but it is now.
Basically, dynamic linking reduces update overhead, like with static linking you’ll need to download full binary every update, even if lib is tiny, while with dynamic you’ll have to download only small lib.
Okay, but I’m much more concerned with execution speed and memory usage than with how long it takes to download or compile an executable.
I wouldn’t expect them to have many libraries in common, other than platform libraries like libc, since they have completely different purposes.
I was under the impression that Docker is for server applications. Is it even possible to run a GUI app inside a Docker container?
Also, if you are going to make something that have more than one binary
If they’re meant to run on the same machine and are bundled together in the same container image, I would call that a questionable design choice.
In the time i was thinking about some kind of toolkit installed though distrobox. Distrobox, basically, allows you to use anything from containers as if it was not. It uses podman, so i guess it could be impossible to use docker for GUI, although i cant really tell.
inlining is, as matklad once put it, the mother of all other optimizations. Dynamic linking leaves potentially a lot of performance on the table.
Yes, but static linking means you’ll get security and performance patches with some delay, while dynamic means you’ll get patches ASAP.
Yeah, but there’s by lot more security improvement by having ability to apply fix for severe vulnerability ASAP than weakening from possible incompativilities. Also, i wonder why i never brought it up, shared libs are shared, so you can use them across many programming languages. So, no, static is not the way to replace containers with dynamic linking, but yes, they share some use cases.
Yeah, but there’s by lot more security improvement by having ability to apply fix for severe vulnerability ASAP than weakening from possible incompativilities.
Um, we’re talking about undefined behavior here. That creates potential RCE vulnerabilities—the most severe kind of vulnerability. So no, a botched dynamically-linked library update can easily create a vulnerability worse than the one it’s meant to fix.
Also, i wonder why i never brought it up, shared libs are shared, so you can use them across many programming languages.
Shared libraries are shared among processes, not programming languages.
Not without suitable glue code, you can’t. If you want to use a native library with Java or Node.js, you need to wrap it in a JNI or N-API wrapper. The wrapper must be dynamically linked, but the native library can be statically linked with the wrapper. My current project does just that, in fact.
There is one exception I know of. The Java library JNA dynamically links native libraries into a Java program and generates the necessary glue at run time.
Compared to the downsides of using a container image (duplication of system files like libc, dynamic linking overhead, complexity, etc), this is not a compelling advantage.
That seems like a questionable design choice.
I mean, you could have GUI for some CLI tool. Then you would need to run binary GUI, and either run binary CLI from GUI or have it as daemon. Also, if you are going to make something that have more than one binary, you’ll get more space overhead for static linking than for containers
Man, that’s underestimating compiling time and frequency of updates of various libs, and overestimating overhead from dynamic linking (it’s so small it’s calculated in CPU cycles). Basically, dynamic linking reduces update overhead, like with static linking you’ll need to download full binary every update, even if lib is tiny, while with dynamic you’ll have to download only small lib.
Yes, I’ve seen that pattern before, but:
If they’re meant to run on the same machine and are bundled together in the same container image, I would call that a questionable design choice.
Well, I have only my own experience to go on, but I am not usually bothered by compile times. I used to compile my own Linux kernels, for goodness’ sake. I would just leave it to do its thing and go do something else while I wait. Not a big deal.
Again, there are exceptions like Chromium, which take an obscenely long time to compile, but I assume we’re talking about something that takes minutes to compile, not hours or days.
No, I’m not. If you’re not using JIT compilation, the overhead of dynamic linking is severe, not because of how long it takes to call a dynamically-linked function (you’re right, that part is reasonably fast), but because inlining across a dynamic link is impossible, and inlining is, as matklad once put it, the mother of all other optimizations. Dynamic linking leaves potentially a lot of performance on the table.
This wasn’t the case before link-time optimization was a thing, mind you, but it is now.
Okay, but I’m much more concerned with execution speed and memory usage than with how long it takes to download or compile an executable.
In the time i was thinking about some kind of toolkit installed though distrobox. Distrobox, basically, allows you to use anything from containers as if it was not. It uses podman, so i guess it could be impossible to use docker for GUI, although i cant really tell.
Yes, but static linking means you’ll get security and performance patches with some delay, while dynamic means you’ll get patches ASAP.
Some claim this doesn’t work in practice because of the ABI issues I mentioned earlier. You brought up Semver as a solution, but that too doesn’t seem to work in practice; see for example OpenSSL, which follows Semver and still has ABI issues that can result in undefined behavior. Ironically this can create security vulnerabilities.
Yeah, but there’s by lot more security improvement by having ability to apply fix for severe vulnerability ASAP than weakening from possible incompativilities. Also, i wonder why i never brought it up, shared libs are shared, so you can use them across many programming languages. So, no, static is not the way to replace containers with dynamic linking, but yes, they share some use cases.
Um, we’re talking about undefined behavior here. That creates potential RCE vulnerabilities—the most severe kind of vulnerability. So no, a botched dynamically-linked library update can easily create a vulnerability worse than the one it’s meant to fix.
Shared libraries are shared among processes, not programming languages.
You still can use them in any programming language
Not without suitable glue code, you can’t. If you want to use a native library with Java or Node.js, you need to wrap it in a JNI or N-API wrapper. The wrapper must be dynamically linked, but the native library can be statically linked with the wrapper. My current project does just that, in fact.
There is one exception I know of. The Java library JNA dynamically links native libraries into a Java program and generates the necessary glue at run time.