- Tóm tắt quá trình port phiên bản Unix của Lotus đã 30 năm tuổi sang Linux
Bối cảnh
- Là fan của Lotus nên tác giả đã reverse engineering phiên bản DOS cũ, tạo một trình điều khiển hiển thị cho DosEmu để chạy nó
- Tuy nhiên, các add-in của Lotus đời cũ thì không dùng được
- Chúng được phát triển bằng một ngôn ngữ đặc biệt gọi là LPL, nhưng không có compiler/SDK
→ Thời đó đây là một sản phẩm trả phí tới $395, nên không tìm được ai còn giữ
- Sau đó, thông qua một SYSOP từng vận hành BBS trong thập niên 90, tác giả lấy được một bản Warez của SDK từ bản sao lưu trên băng
→ ADK(Add-in Development Kit) for Lotus 1-2-3
- Trên BBS đó cũng có một bản Warez của Lotus 1-2-3 for Unix
→ Đây là sản phẩm đã bị lãng quên vì bán không được bao nhiêu do có đối thủ văn phòng Unix nổi tiếng là SCO Professional
Lotus 1-2-3 for Unix
- Nó được đóng gói dưới định dạng ảnh đĩa nén TD0, một định dạng từng được dùng trong thập niên 80
- Dùng
samdisk để chuyển sang ảnh đĩa raw
- Trong nội dung đĩa, tác giả phát hiện có các object file chứa symbol của 1-2-3
→ Vào đầu thập niên 90, dlopen() chưa được dùng phổ biến nên kiểu này là cần thiết
Hack
- Nhờ các object file này, nhiều thắc mắc về cấu trúc nội bộ của Lotus 1-2-3 đã được giải đáp
- Trình điều khiển đang làm cũng có thể đảm nhiệm được nhiều việc hơn
GNU objcopy
- Khi các object file này được biên dịch thì phiên bản Linux đầu tiên còn chưa ra mắt
- Nhưng có thể dùng
objcopy để chuyển object file COFF sang ELF
Vấn đề khi port
System Calls
- Vấn đề đầu tiên là Linux và UNIX không có cùng giao diện system call
- UNIX dùng giao diện
lcall7, nên tác giả quyết định tìm open() rồi gọi qua glibc
→ Nếu đổi symbol này thành undefined thì linker có tự xử lý không?
→ Nhưng objcopy không hoạt động theo cách đó, nên cuối cùng tác giả đã viết một công cụ tên là coffsyrup để ép xóa chúng
- Một số hàm không tương thích khác cũng được thay đổi hết bằng
objcopy + coffsyrup
→ stat(), times(), uname(), fcntl(), ioctl()
Licensing
- Tất nhiên, phần mềm này không chạy nếu không có license
- Tác giả là chủ sở hữu hợp pháp của hộp Lotus 1-2-3, và đây cũng là abandonware đã 32 năm tuổi, nên anh cho rằng có lẽ ngay cả Mitch Kapor cũng sẽ không phản đối việc bỏ qua bước kiểm tra license này
→ (Mitch Kapor nổi tiếng là người tạo ra Lotus, đồng thời cũng là đồng sáng lập EFF.)
- Trong hàm
lic_init(), nếu file LICENSE.000 có ngày tháng cùng tên người dùng/tên hệ thống thì chương trình sẽ chạy, nên tác giả đã khớp các giá trị đó để vượt qua
Kết quả
- Kết quả là Lotus 1-2-3 đã được port sang một OS mới là Linux
- Vẫn còn vài chỗ hơi rối, nhưng đã dùng được 100%
4 bình luận
Trời ơi... cái này là gì vậy.. hãi thật
Đúng là trong những người giỏi còn có người giỏi hơn... câu đó quả thật không sai..
Wow.. thật sự là một niềm đam mê đáng kinh ngạc. Tôi không dùng Lotus nhiều đến vậy, mà chủ yếu dùng Multiplan.
https://en.wikipedia.org/wiki/Multiplan
Multiplan cũng từng có bản tiếng Hàn, nên vào thời đó đây là sản phẩm duy nhất hỗ trợ tiếng Hàn một cách đàng hoàng.
Dù đã bị ngừng sản xuất vào năm 94, nhưng ở Hàn Quốc vẫn có nhiều công ty đang sử dụng, nên tôi nghĩ nó còn được dùng đến khoảng năm 97.
Multiplan bị ngừng sản xuất - hồi kết của thời đại DOS
https://www.hellomarket.com/item/162929337
Tôi đã tìm thấy một bài đăng bán gói Multiplan tiếng Hàn còn nguyên niêm phong.. uầy..