Add elf_read_{,next_}uleb128
diff --git a/ltrace-elf.c b/ltrace-elf.c
index b2e6e07..b045d64 100644
--- a/ltrace-elf.c
+++ b/ltrace-elf.c
@@ -263,6 +263,38 @@
 #undef DEF_READER
 
 int
+elf_read_next_uleb128(Elf_Data *data, GElf_Xword *offset, uint64_t *retp)
+{
+	uint64_t result = 0;
+	int shift = 0;
+	int size = 8 * sizeof result;
+
+	while (1) {
+		uint8_t byte;
+		if (elf_read_next_u8(data, offset, &byte) < 0)
+			return -1;
+
+		uint8_t payload = byte & 0x7f;
+		result |= (uint64_t)payload << shift;
+		shift += 7;
+		if (shift > size && byte != 0x1)
+			return -1;
+		if ((byte & 0x80) == 0)
+			break;
+	}
+
+	if (retp != NULL)
+		*retp = result;
+	return 0;
+}
+
+int
+elf_read_uleb128(Elf_Data *data, GElf_Xword offset, uint64_t *retp)
+{
+	return elf_read_next_uleb128(data, &offset, retp);
+}
+
+int
 open_elf(struct ltelf *lte, const char *filename)
 {
 	lte->fd = open(filename, O_RDONLY);