Khái niệm và cách dùng của thư viện động, thư viện tĩnh không phải là một kiến thức gì xa lạ. Trong môn lập trình C căn bản ở trường đại học, các thầy cũng giảng về khái niệm static linking và dynamic linking trong môn lập trình C. Tuy nhiên, áp dụng những kiến thức đó trong dự án thật lại là chuyện khác. Những vấn đề lý thuyết khi xuất hiện trong dự án thật sẽ muôn hình muôn vẻ nên không phải lúc nào chúng ta cũng dễ dàng nhận ra được.
Công việc đầu tiên tôi làm liên quan đến phát triển module chạy trong nhân của hệ điều hành MacOS. Trước đấy, do chuyển từ ngành xây dựng sang, làm nhiều nghề lao động phổ thông nên chuyện xin được việc về lập trình đối với tôi là một chuyện rất quan trọng. Trong buổi phỏng vấn vào dự án, khi được hỏi về mức lương mong muốn mình, tôi sẵn sàng trả lời rằng mình có thể đi làm không cần lương. Kể lan man một chút vì đoạn này liên quan đến mạch chuyện về sau.
Tôi có 3 tháng thử việc. Mới đầu, tôi được giao cho làm một số việc lặt vặt. Sau đó, anh tech lead có giao cho tôi 1 task lớn. Đấy là build source code của thư viện Curl để dùng cho MacOS. Anh ấy đưa cho tôi bộ code Curl trên Windows mà team đã build được, việc của tôi lúc này là chạy lại các câu lệnh build và sửa lỗi build trên MacOS. Thực sự mà nói về công việc build source code thư viện, nếu như chúng ta không hiểu bản chất của các bước, khi 1 lỗi xuất hiện và sửa sai cách, lỗi đó có thể biến mất và gây ra 1 lỗi khác ở những bước sau. Và nếu cứ tiếp tục thì càng sửa lại càng sai, đúng nghĩa “sai một li, đi một dặm”. Tôi mất 1 tháng rưỡi mà không thể build được thành công. Về sau, tôi đã phát hiện ra là bộ IDE XCode ở trên MacOS có sẵn thư viện động của Curl. Chỉ cần cấu hình trong phần linking của Xcode là dùng được. Bây giờ, khi nghĩ lại, tôi thấy nguyên nhân là do trong team cũng như trong công ty không có ai có kiến thức về hệ điều hành đễ hỗ trợ khi tôi gặp khó khăn, bế tắc. Thực ra những cái này chỉ thuộc về mảng kiến thức cơ bản chứ không có gì cao siêu.
Mặc dù đã hoàn thành task được giao, tuy nhiên, tôi vẫn bị đánh trượt thử việc vì thời gian làm quá lâu. Và kết quả sau 3 tháng thử việ, tôi lại bị thử việc thêm 3 tháng nữa. Một công việc phải rất khó khăn tôi mới nhận được, dù đã cố gắng hết sức nhưng cuối cùng vẫn không qua được. Trong đầu tôi khi ấy xuất hiện đủ loại cảm xúc, và có lẽ sự mông lung đang chiếm phần lớn trong suy nghĩ của tôi. Thật sự tôi không thể biết được sau 3 tháng nữa thì kết quả sẽ thế nào.
Tuy đã được học về static linking và dynamic linking ở trên trường, tuy nhiên tôi lại không thực hành gì liên quan đến những kiến thức ấy. Đa số lúc đó code, tôi dùng IDE với những thư viện chuẩn của C nên cứ ấn nút build là code sẽ chạy, không cần phải quan tâm gì nhiều. Sau này, tôi hay bắt học viện phải code và build trực tiếp trên command line vì như vậy sẽ khiến người học thực sự hiểu sâu về vấn đề. Việc hỗ trợ quá nhiều của IDE cũng có những mặt trái của nó.
Kiến thức về thư viện động và thư viện tĩnh rất cơ bản, không có gì “đao to búa lớn” (tôi đã nói tương đối cụ thể ở những video tôi đăng trên kênh youtube). Tuy nhiên, cũng có những lỗi xuất hiện trong dự án liên quan đến thư viện động mà cần phải có kỹ thuật nâng cao để debug chúng. Gần đây, tôi đã gặp và phải xử lý một số lỗi, cụ thể như sau:
- Lỗi thư viện động không tương thích với chương trình mình đã build từ trước.
Vậy sau khi update thư viện thì sản phẩm chạy lỗi, tôi đã khắc phục như thế nào?
Tôi debug bằng cách dùng tool dump thông tin của file binary của thư viện động. Lấy ra option của Gcc dùng trong lúc build thư viện. Tìm ra option gây nên sự xung đột với chương trình của mình.
- Lỗi thư viện động sau khi update nhưng chương trình vẫn chạy thư viện cũ.
Khi gặp trường hợp này, tôi đã sử dụng câu lệnh của hệ điều hành để truy vấn danh sách các thư viện động trong quá đang chạy. Dump một phần bộ nhớ trên ram của thư viện động để lấy thông tin đối chiếu với file thư viện đã build.
- Lỗi quá trình không tải được thư viện động.
Để xử lí tình trạng này, tôi quyết định dump thông tin file binary của quá trình, lấy ra danh sách đường dẫn các thư viện động mà nó cần tải. Sau đó, tôi đối chiếu với danh sách trên hệ thống xem có đúng hay không.
Hệ điều hành là một lĩnh vực bao hàm rất nhiều các loại lý thuyết, những biểu hiện lỗi khi xuất hiện nếu như chúng ta không biết nó xuất phát từ lý thuyết nào thì đôi khi biểu hiện của chúng sẽ khiến chúng ta cảm thấy thực sự kỳ lạ. Dù vậy, nếu chúng ta có thể tìm ra cách để sửa thì chúng cũng rất vui và thú vị.