1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 03:30:27 +02:00

linker: Create a sparse file only when writing to a file port.

Fixes a regression introduced in
4a0c2433d9: the strategy wouldn’t work
when writing to, say, a bytevector output port.

* module/system/vm/linker.scm (link-elf)[write-padding]: Reintroduce
loop for when PORT is not a file port.  Remove first argument.
This commit is contained in:
Ludovic Courtès 2024-04-16 00:34:01 +02:00
parent 696acfc9e5
commit 112b617f59
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -769,10 +769,21 @@ Returns a bytevector."
objects) objects)
bv) bv)
(lambda (port) (lambda (port)
(define (write-padding port size) (define write-padding
;; Write SIZE bytes of padding to PORT. Use 'seek' to ;; Write SIZE bytes of padding to PORT.
;; create a sparse file. (if (file-port? port)
(lambda (size)
;; Use 'seek' to create a sparse file.
(seek port size SEEK_CUR)) (seek port size SEEK_CUR))
(let ((blank (make-bytevector 4096 0)))
(lambda (size)
;; Write SIZE zeros.
(let loop ((size size))
(unless (zero? size)
(let ((count (min size
(bytevector-length blank))))
(put-bytevector port blank 0 count)
(loop (- size count)))))))))
(define (compute-padding objects) (define (compute-padding objects)
;; Return the list of padding in between OBJECTS--the list ;; Return the list of padding in between OBJECTS--the list
@ -796,7 +807,7 @@ Returns a bytevector."
(for-each (for-each
(lambda (object padding) (lambda (object padding)
(let ((bv (make-bytevector (linker-object-size object) 0))) (let ((bv (make-bytevector (linker-object-size object) 0)))
(write-padding port padding) (write-padding padding)
(write-linker-object bv object symtab endianness) (write-linker-object bv object symtab endianness)
(put-bytevector port bv))) (put-bytevector port bv)))
objects objects