1import nose
2import cle
3import os
4
5
6class MockBackend(cle.backends.Backend):
7    def __init__(self, linked_base, size, **kwargs):
8        super().__init__('/dev/zero', None, **kwargs)
9        self.mapped_base = self.linked_base = linked_base
10        self.size = size
11        self.pic = True
12
13    @property
14    def max_addr(self):
15        return self.mapped_base + self.size - 1
16
17
18def test_overlap():
19    filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../binaries/tests/i386/manysum')
20    ld = cle.Loader(filename, auto_load_libs=False)
21    nose.tools.assert_equal(ld.main_object.linked_base, 0x8048000)
22    nose.tools.assert_equal(ld.main_object.min_addr, 0x8048000)
23
24    obj1 = MockBackend(0x8047000, 0x2000, arch=ld.main_object.arch)
25    obj2 = MockBackend(0x8047000, 0x1000, arch=ld.main_object.arch)
26
27    ld.dynamic_load(obj1)
28    ld.dynamic_load(obj2)
29
30    nose.tools.assert_equal(obj2.mapped_base, 0x8047000)
31    nose.tools.assert_greater(obj1.mapped_base, 0x8048000)
32
33if __name__ == '__main__':
34    test_overlap()
35