On Saturday 23 February 2013 15:56:20 Eric Blake wrote: > On 02/23/2013 10:25 AM, Salvador Girbau wrote: > > Hi all, > > would it be possible to replace /usr/bin/[ with a symlink to > > /usr/bin/test ? > > Not really. Although [ and test are compiled from the same sources, > they are compiled with different macro definitions, and have different > behavior (namely, whether --help is supported, and whether a ] must > appear as the last command line argument). GNU Coding Standards > recommend that programs never inspect argv[0] as a means of dynamically > changing their behavior, and coreutils follows this rule by compiling > two separate binaries with the two different behaviors, regardless of > what the resulting binary finally gets named. > > If you want to go for minimal binary size, then busybox is a better > project - that project has intentionally decided to base behavior on the > name of argv[0], and hence can symlink both [ and test to the same > busybox binary (along with a host of other utilties all crammed into one > super-binary). But coreutils will not be adopting that approach.
an example of why argv[0] can be bad: doing execve with argv[0] set to NULL is not an error, and apps that rely on argv[0] will usually segfault immediately. or they won't be able to figure out how they're supposed to behave. for example: $ cat test.c #include <unistd.h> int main(int argc, char *argv[]) { char *args[1] = {0}; return execve(argv[1], args, 0); } $ gcc -Wall test.c $ ./a.out /bin/dmesg <works> $ ./a.out /bin/ip <segfault> $ ./a.out /bin/mv <aborts> personally, i find it a bit ironic that a lot of GNU apps (including coreutils) simply abort() themselves when argv[0]==NULL considering the project's hard line position about not relying on argv[0] for behavior. -mike
signature.asc
Description: This is a digitally signed message part.