Print this page
4270 ld(1) argument error reporting is still pretty bad
4227 ld --library-path is translated to -l-path, not -L

*** 299,311 **** optarg = str; return (c); } /* ! * Determine whether this string, possibly with an associated option, should be ! * translated to an option character. If so, update the optind and optarg ! * as described for short options in getopt(3c). * * entry: * lml - Link map list for debug messages * ndx - Starting optind for current item * argc, argv - Command line arguments --- 299,311 ---- optarg = str; return (c); } /* ! * Determine whether this string, possibly with an associated option, should ! * be translated to an option character. If so, update the optind and optarg ! * and optopt as described for short options in getopt(3c). * * entry: * lml - Link map list for debug messages * ndx - Starting optind for current item * argc, argv - Command line arguments
*** 327,340 **** * argument). */ if (strcmp(arg, opt) == 0) { DBG_CALL(Dbg_args_str2chr(lml, ndx, opt, c)); optind += 1; return (c); } ! ! } else if (strncmp(arg, opt, optsz) == 0) { /* * Otherwise, compare the option name, which may be * concatenated with the option argument. */ DBG_CALL(Dbg_args_str2chr(lml, ndx, opt, c)); --- 327,341 ---- * argument). */ if (strcmp(arg, opt) == 0) { DBG_CALL(Dbg_args_str2chr(lml, ndx, opt, c)); optind += 1; + optopt = c; return (c); } ! } else if ((strcmp(arg, opt) == 0) || ! ((arg[optsz] == '=') && strncmp(arg, opt, optsz) == 0)) { /* * Otherwise, compare the option name, which may be * concatenated with the option argument. */ DBG_CALL(Dbg_args_str2chr(lml, ndx, opt, c));
*** 343,376 **** /* * Optarg is the next argument (white space separated). * Make sure an optarg is available, and if not return * a failure to prevent any fall-through to the generic * getopt() processing. */ if ((++optind + 1) > argc) { return ('?'); } optarg = argv[optind]; optind++; } else { /* - * Optarg concatenated to option (no white space). * GNU option/option argument pairs can be represented * with a "=" separator. If this is the case, remove * the separator. */ optarg = &arg[optsz]; optind++; if (*optarg == '=') { if (*(++optarg) == '\0') return ('?'); } } if (cbfunc != NULL) c = (*cbfunc)(c); ! return (c); } return (0); } --- 344,384 ---- /* * Optarg is the next argument (white space separated). * Make sure an optarg is available, and if not return * a failure to prevent any fall-through to the generic * getopt() processing. + * + * Since we'll be completely failing this option we + * don't want to update optopt with the translation, + * but also need to set it to _something_. Setting it + * to the '-' of the argument causes us to behave + * correctly. */ if ((++optind + 1) > argc) { + optopt = arg[0]; return ('?'); } optarg = argv[optind]; optind++; } else { /* * GNU option/option argument pairs can be represented * with a "=" separator. If this is the case, remove * the separator. */ optarg = &arg[optsz]; optind++; if (*optarg == '=') { if (*(++optarg) == '\0') + optopt = arg[0]; return ('?'); } } if (cbfunc != NULL) c = (*cbfunc)(c); ! optopt = c; return (c); } return (0); }