This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
ld atm ends up calling the write() syscall on every char when displaying an error message. for example: $ echo 'main(){foo();}' | strace -f -ewrite gcc -x c -o /dev/null - ... [pid 13035] write(2, ":", 1) = 1 [pid 13035] write(2, " ", 1) = 1 [pid 13035] write(2, "I", 1) = 1 [pid 13035] write(2, "n", 1) = 1 [pid 13035] write(2, " ", 1) = 1 [pid 13035] write(2, "f", 1) = 1 [pid 13035] write(2, "u", 1) = 1 [pid 13035] write(2, "n", 1) = 1 [pid 13035] write(2, "c", 1) = 1 [pid 13035] write(2, "t", 1) = 1 [pid 13035] write(2, "i", 1) = 1 [pid 13035] write(2, "o", 1) = 1 [pid 13035] write(2, "n", 1) = 1 [pid 13035] write(2, " ", 1) = 1 [pid 13035] write(2, "`", 1) = 1 ... that's just to write ": In function `main':". a slight optimization in the vfinfo() func gives a much more reasonable syscall footprint: ... write(2, ": In function `", 15) = 15 ... it's been a while since i've hacked in these layers, so i'm not sure if there's something better than just calling abort() here ... -mike 2012-03-24 Mike Frysinger <vapier@gentoo.org> * ldmisc.c (vfinfo): Assign new local str to fmt. Delete putc call. If str and fmt are different, call fwrite on the difference. --- ldmisc.c 18 Feb 2012 11:55:45 -0000 1.42 +++ ldmisc.c 24 Mar 2012 05:13:24 -0000 @@ -72,10 +72,15 @@ vfinfo (FILE *fp, const char *fmt, va_li while (*fmt != '\0') { + const char *str = fmt; while (*fmt != '%' && *fmt != '\0') + fmt++; + if (fmt != str) { - putc (*fmt, fp); - fmt++; + size_t len = fmt - str; + + if (fwrite (str, 1, len, fp) != len) + abort (); } if (*fmt == '%')
Attachment:
signature.asc
Description: This is a digitally signed message part.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |