Thanks to the suggestions from Kamil Maciorowski and his answers elsewhere, I could build the following process and test it:
1) create a test file and compute its hash to check future recovery
dd if=/dev/urandom of=/tmp/file bs=512 count=32768 status=progress
sha256sum /tmp/file
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503 /tmp/file
2) Create a device with it
loopdev=\`losetup -f --show /tmp/file\`
echo $loopdev
/dev/loop1
3) Create corrupted devices with bad blocks thanks to devicemapper
dmsetup create file1 << EOF
0 2048 linear $loopdev 0
2048 4096 error
6144 26624 linear $loopdev 6144
EOF
dmsetup create file2 << EOF
0 30720 linear $loopdev 0
30720 2048 error
EOF
ls -l /dev/mapper/
lrwxrwxrwx 1 root root 7 mai 30 09:27 file1 -> ../dm-2
lrwxrwxrwx 1 root root 7 mai 30 09:27 file2 -> ../dm-3
Notice that in each line, the first number is the position and second one the size, so in the last one, the sum is the size of the file : 6144 + 26624 = 32768, and 30720 + 2048 = 32768
The line 6144 26624 linear $loopdev 6144 means: copy device $loopdev from offset 6144 (in bytes) to file1 at offset 6144 (in bytes) and for a size of 26624 bytes.
4) Check i/o errors at expected locations
dd if=/dev/mapper/file1 of=/dev/null count=2048
ok
dd if=/dev/mapper/file1 of=/dev/null count=2049
dd: error reading '/dev/mapper/file1': Input/output error
dd if=/dev/mapper/file2 of=/dev/null count=30720
ok
dd if=/dev/mapper/file2 of=/dev/null count=30721
dd: error reading '/dev/mapper/file2': Input/output error
At this stage, the OP question is answered. Let's go further to finish the test:
5) test ddrescue : good blocks only
ddrescue -B -v -n /dev/mapper/file1 /tmp/file1 /tmp/log
percent rescued: 87.50%
sha256sum /tmp/file1
0d344253f69688e23dd4558c2ffdabb0325f85848f7e65788ea5c9441e7a700c /tmp/file1
6) Repair successfully bad blocks with the second copy
ddrescue -B -v -c 16 -r 2 /dev/mapper/file2 /tmp/file1 /tmp/log
percent rescued: 100.00%
sha256sum /tmp/file1
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503 /tmp/file1
7) If required (not 100%), try to rescue bad blocks with the 1st copy
ddrescue -B -v -c 16 -r 2 /dev/mapper/file1 /tmp/file1 /tmp/log
8) Cleanup
dmsetup remove file1
dmsetup remove file2
unset loopdev
rm /tmp/file* /tmp/log